在CSDN上看到MoreWindows关于多线程的专题觉得蛮不错的。不过写到互斥量之后就没有再更新了,觉得有点可惜了,索性就来个狗尾续貂,用抛砖引玉的形式续写一下后面的章节吧
信号量内核对象用来对资源计数。与其他所有内核对象相同,它们也包含一个使用计数,但它们还包含另外两个32位值:一个最大资源和一个当前资源计数。最大资源技术表示信号量可以控制的最大资源,当前资源技术表示当前可用资源。
信号量的规则如下:
(1)如果当前资源计数大于0,那么信号量处于触发状态
(2) 如果当前资源计数等于0,那么信号量属于未触发状态
(3)系统绝对不会让当前资源计数变为负数
(4)当前资源计数绝对不会大于最大资源计数
-------摘自《Windows核心编程》
Semahpore主要用到四个函数:
第一个CreateSemaphore
函数功能:创建信号量
函数原型:
HANDLE CreateSemaphore(
PSECURITY_ATTRIBUTE psa,
LONG lInitialCount,
LONG lMaximumCount,
PCTSTR pszName
);
函数说明:
psa 安全控制,一般传入NULL
lInitialCount 设置信号量的初始计数
lMaximumCount 设置信号量的最大计数lpName 指定信号量对象的名称
第二个OpenSemaphore
函数功能:为现有的一个已命名信号机对象创建一个新句柄
函数原型:
HANDLE OpenSemaphore(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
PCTSTR pszName
);
函数说明:
dwDesiredAccess,下述常数之一:
SEMAPHORE_ALL_ACCESS 要求对事件对象的完全访问;
SEMAPHORE_MODIFY_STATE 允许使用ReleaseSemaphore函数;
SYNCHRONIZE 允许同步使用信号机对象。
bInheritHandle,如果允许子进程继承句柄,则设为TRUE。
lpName,指定要打开的对象的名字。
第三个ReleaseSemaphore
函数功能:递增信号量的当前资源计数
函数原型:
HANDLE ReleaseSemaphore(
HANDLE hSemaphore,
LONG lReleaseCount,
PLONG plPreviousCount
);
函数说明:
hSemaphore 信号量句柄
lReleaseCount 把lReleaseCount的值增加到当前资源技术上
plPreviousCount 返回当前资源计数的原始值
第四个CloseHandle
清理信号量CloseHandle()
用信号量解决专栏提出的那个线程同步的问题有点大材小用了,不过依然可以完善的解决。基本思想就是设置一个最大资源数为1的信号量,初始时资源为0,主线程CreadThread后调用WaitSingleObject来等待信号量触发,子线程启动后操作完成需要工作后调用ReleaseSemaphore函数,将资源数增加到1信号量被触发。当WaitSingleObject调用后,资源会减1,资源数重新变成0。
代码如下:
运行结果如下图: