一、
当多个线程对同一资源进行使用时,会产生“争夺”的情况,为了避免这种情况的产生,也就出现了线程间的同步这个技术,本篇博文中将介绍使用信号量Semaphore达到线程间同步的目的。
二、相关函数和头文件
//头文件 #include <windows.h> //创建信号量API HANDLE WINAPI CreateSemaphore( _In_opt_ LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,//指向SECURITY_ATTRIBUTES的指针; _In_ LONG lInitialCount, //信号量对象的初始值; _In_ LONG lMaximumCount, //信号量对象的最大值,这个值必须大于0; _In_opt_ LPCTSTR lpName //信号量对象的名称; ); //等待信号量API DWORD WINAPI WaitForSingleObject( _In_ HANDLE hHandle, //信号量对象句柄 _In_ DWORD dwMilliseconds //等待信号量时间,INFINET代表永久等待; ); 返回值: WAIT_ABANDONED(0x00000080L) 表示拥有信号量的线程再终止前未释放该信号量; WAIT_OBJECT_0(0x00000000L) 表示等到了信号量; WAIT_TIMEOUT(0x00000102L) 表示等待超时; WAIT_FAILED((DWORD)0xFFFFFFFF) 表示该函数执行失败,用GetLastError()得到错误码; //释放信号量句柄 BOOL WINAPI ReleaseSemaphore( _In_ HANDLE hSemaphore, //信号量对象句柄; _In_ LONG lReleaseCount, //信号量释放的值,必须大于0; _Out_opt_ LPLONG lpPreviousCount //前一次信号量值的指针,不需要可置为空; ); 返回值:成功返回非0;
三、范例
#include <iostream> #include <windows.h> using namespace std; HANDLE g_hSemaphore = NULL; //声明信号量变量 unsigned long WINAPI Fun(LPVOID lpParamter) { int iRunTime = 0; //执行100次跳出 while(++iRunTime<100) { WaitForSingleObject(g_hSemaphore, INFINITE); //信号量值-1 cout << "Fun() is running!"<<endl; ReleaseSemaphore(g_hSemaphore, 1, NULL); //信号量值+1 Sleep(10); } ExitThread(-1); } int main() { //创建信号量对象 g_hSemaphore = CreateSemaphore(NULL //信号量的安全特性 , 1 //设置信号量的初始计数。可设置零到最大值之间的一个值 , 1 //设置信号量的最大计数 , NULL //指定信号量对象的名称 ); if(NULL == g_hSemaphore) { cout << "create hSemaphore failed! error_code:"<<GetLastError()<<endl; return 0; } int iRunTime = 0; unsigned long ulThreadId = 0; //创建一个子线程 HANDLE hThread = CreateThread(NULL, 0, Fun, NULL, 0, &ulThreadId); //执行100次跳出 while(++iRunTime<100) { WaitForSingleObject(g_hSemaphore, INFINITE); //信号量值-1 cout << "main() is running, Thread id is " << ulThreadId <<endl; ReleaseSemaphore(g_hSemaphore, 1, NULL); //信号量值+1 Sleep(10); } system("pause"); return 0; }