多线程信号量

用SetEvent()或PulseEvent()来设置它使其有信号,用ResetEvent() 来使其无信号,用WaitForSingleObject()或WaitForMultipleObjects()来等待 其变为有信号.

相关函数

WaitForSingleObject

DWORD WaitForSingleObject( 
HANDLE hHandle, 
DWORD dwMilliseconds 
);

      参数hHandle是一个事件的句柄,第二个参数dwMilliseconds是时间间隔。如果时间是有信号状态返回WAIT_OBJECT_0,如果时间超过dwMilliseconds值但时间事件还是无信号状态则返回WAIT_TIMEOUT。

       WaitForSingleObject函数用来检测hHandle事件的信号状态,当函数的执行时间超过dwMilliseconds就返回,但如果参数dwMilliseconds为INFINITE时函数将直到相应时间事件变成有信号状态才返回,否则就一直等待下去,直到WaitForSingleObject有返回直才执行后面的代码。

CreateEvent

HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes,// 安全属性
BOOL bManualReset,// 复位方式
BOOL bInitialState,// 初始状态
LPCTSTR lpName // 对象名称
);

lpEventAttributes:
        [输入]一个指向SECURITY_ATTRIBUTES结构的指针,确定返回的句柄是否可被子进程继承。如果lpEventAttributes是NULL,此句柄不能被继承。Windows NT/2000:lpEventAttributes的结构中的成员为新的事件指定了一个安全符。如果lpEventAttributes是NULL,事件将获得一个默认的安全符。
bManualReset:
       [输入]指定将事件对象创建成手动复原还是自动复原。如果是TRUE,那么必须用ResetEvent函数来手工将事件的状态复原到无信号状态。如果设置为FALSE,当事件被一个等待线程释放以后,系统将会自动将事件状态复原为无信号状态。
bInitialState:
       [输入]指定事件对象的初始状态。如果为TRUE,初始状态为有信号状态;否则为无信号状态。
lpName:
       [输入]指定事件的对象的名称,是一个以0结束的字符串指针。名称的字符格式限定在MAX_PATH之内。名字是对大小写敏感的。
       如果lpName指定的名字,与一个存在的命名的事件对象的名称相同,函数将请求EVENT_ALL_ACCESS来访问存在的对象。这时候,由于bManualReset和bInitialState参数已经在创建事件的进程中设置,这两个参数将被忽略。如果lpEventAttributes是参数不是NULL,它将确定此句柄是否可以被继承,但是其安全描述符成员将被忽略。
       如果lpName为NULL,将创建一个无名的事件对象。
       如果lpName的和一个存在的信号、互斥、等待计时器、作业或者是文件映射对象名称相同,函数将会失败,在GetLastError函数中将返回ERROR_INVALID_HANDLE。造成这种现象的原因是这些对象共享同一个命名空间。


SuspendThread和ResumeThread

        使用 SuspendThread 和 ResumeThread 函数(Windows API 或 CWinThread 类成员函数),线程可以挂起或恢复另一个线程的运行。当线程处于挂起状态时,线程不会被调度运行。SuspendThread 函数将当前线程的挂起次数加 1。若该值的挂起次数大于 0,则该线程不运行。ResumeThread 函数将当前线程的挂起次数减 1。当该值为 0 时,线程恢复运行,否则线程仍处于挂起状态。如果将线程创建在挂起状态,那么在调用 ResumeThread  恢复执行之前可以完成对线程状态的初始化工作。
        另外可通过调用 Sleep 或 SleepEx 函数暂时挂起当前线程一段指定时间。它常用于线程与用户的交互中,通过延迟执行线程足够长的时间让用户观察其结果。在睡眠期间线程不会被调度执行。

 

 

 

 

你可能感兴趣的:(多线程信号量)