
Windows
文章平均质量分 64
小飞1116
这个作者很懒,什么都没留下…
展开
-
用内核对象进行线程同步——信号量内核对象
信号量内核对象包含一个使用计数,还有另外俩个32位值:一个最大资源计数,一个当前资源计数。 最大资源计数表示信号量可以控制的最大资源数量,即可以同时调度的最大线程数;当前资源计数表示信号量当前可用资源的数量,即当前可调度的线程数。信号量规则: 1. 当前资源计数 > 0, 信号量处于触发状态 2. 当前资源计数 = 0, 信号量处于未触发状态 3. 系统绝不会让当前资源计数 < 0原创 2017-08-09 19:03:54 · 451 阅读 · 0 评论 -
用户模式下的多线程同步——关键段
关键段使线程访问共享资源之前独占它,共享资源访问结束后线程释放对资源的独占。但是这个过程中,系统也可能暂停该线程取调度其他线程,但是,在关键段释放之前,不会调度其他想访问同一资源的线程。#include "stdafx.h"#include <windows.h> #include <process.h> #include <iostream>using namespace原创 2017-08-08 14:58:26 · 167 阅读 · 0 评论 -
用内核对象进行线程同步——事件内核对象
事件内核对象 1. 手动重置事件:当一个手动重置事件被触发的时候,所有等待该事件的线程都变为可调度状态。所以要注意此时所有的线程都只能以只读的方式来访问内存,这也是多个线程能够同时运行的唯一原因 2. 自动重置事件:当一个自动重置事件被触发的时候,只有一个等待该事件的线程都变为可调度状态(当线程成功等到事件触发的时候,会自动的把事件重置为未触发状态),其余的继续等待。创建一个事件内核对象HA原创 2017-08-09 11:04:16 · 323 阅读 · 0 评论 -
用户模式下的多线程同步——原子访问(Interlocked系列函数)
下面这段代码,通过俩个线程改变一个全局变量的值,咋一看,没什么问题,g_x通过每个线程都自增1,最后g_x的值为2。但实际上有多个线程改变共享变量的值时,如果不加其他任何操作,是很危险的,最后共享变量的值往往不可预见。 简单分析下原因 我们期待的执行顺序是: Thread1. g_x把值(0)存在寄存器中 Thread1. 寄存器值加1变为1 Thread1. 把1存放回到g_x Thr原创 2017-08-08 13:38:59 · 323 阅读 · 0 评论 -
用户模式下的线程同步——Slim读/写锁
SRWLock的目的和关键段一样,但不同的是SRWLock可以区分哪些线程要读取共享资源,哪些要更新共享资源。读取共享资源的线程因为不会破坏共享资源的数据,故这些线程可以同时读取同一共享资源,但要更新共享资源的线程必须独占共享资源,此时读取线程也没有权限访问共享资源。更新线程: 1.定义一个SRWLOCk结构,并用InitializeSRWLock函数对它进行初始化:VOID Initialize原创 2017-08-08 16:58:03 · 318 阅读 · 0 评论 -
用内核对象进行线程同步——互斥量内核对象
互斥内核对象用来确保一个线程独占对一个资源的访问。互斥亮和关键段的的行为完全相同,但关键段是用户模式下的同步对象,意味着互斥量比关键段慢。创建互斥量// bInitialOwner// FALSE:互斥量不为任何线程所占用,处于触发状态; // TRUE:互斥量被调用线程线程所占用,处于未触发状态HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lp原创 2017-08-09 15:03:46 · 272 阅读 · 0 评论 -
C++ 输出文字到csv文件 乱码问题
要写一个utf-8的文件头,然后输入到csv文件开头,如下TCHAR wszUTF_8BOM[4] = {(TCHAR)0xEF, (TCHAR)0xBB, (TCHAR)0xBF, 0};原创 2016-09-27 19:09:12 · 4768 阅读 · 0 评论 -
如何获取操作系统的语言版本
对于支持多语言版本的程序来说,可能需要根据操作系统的语言版本来加载不同的dll或rc,以实现多国语的目的。至于如何加载dll或rc,请参考下面链接http://blog.youkuaiyun.com/xiaofeizai1116/article/details/52317583言归正传,系统提供了获取多个获取语言的API函数:GetSystemDefaultLangID GetUs原创 2016-08-26 16:39:43 · 2540 阅读 · 0 评论 -
获取Windows系统版本
void GetWinOS(CString& strOsName){ OSVERSIONINFO osvi; osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); if (GetVersionEx(&osvi)) { // Windows 32位的操作系统 // 主版本号 osv.dwMa原创 2016-08-24 18:21:48 · 931 阅读 · 1 评论