进程与线程(六)用内核对象进行线程同步(下)

来源:互联网 发布:漫画控网络错误 编辑:程序博客网 时间:2024/06/04 19:44

信号量,资源计数为0时未触发,计数大于0时触发,现在看这个例子可能不会觉得有什么用,等到多线程这块结束时拿出一个我高二时写的多线程的例子~就会看出其用处了~暂且无聊一下~

  1 int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])   2 {   3     _tsetlocale(LC_ALL,_T("chs") );   4     system("title ReturnsMe的win32api测试程序");     5   6     //创建一个信号量,初始资源计数为0,最大资源计数为5   7     HANDLE hSemaphore = CreateSemaphore(NULL,0,5,NULL);   8   9     wprintf(_T("create a Semaphore \n"));  10  11     HANDLE h[10];  12     //本来我是想把信号量内核对象弄成全局变量的,不知怎么到线程里全局变量就变成0了,日,只好改成线程参数进去了  13     for (int i=0;i<10;i++)  14     {  15         h[i] = chBEGINTHREADEX(NULL,NULL,SetThread,(PVOID)&hSemaphore,0,NULL);   16     }  17       18     WaitForMultipleObjects(10,h,TRUE,INFINITE);  19     system("pause");  20     return 0;  21 }  22  23 DWORD WINAPI SetThread(PHANDLE &hSemaphore)  24 {  25     wprintf(_T("Semaphore will be released within 2s \n"));  26     Sleep(2000);  27     //资源计数加1  28     if (ReleaseSemaphore(hSemaphore,1,NULL) == FALSE)  29     {  30         //wprintf(_T("error code :%d \n"),GetLastError());  31         return 0;  32     }  33     wprintf(_T("called \n"));  34  35     return 0;  36 }  37  38


上面这个代码虽然开了10线程,但只有5个会打印出called。

互斥,应用有很多,不一定只是线程同步,互斥可以保证一个线程访问资源,跟关键段类似,不过这个是内核对象。
 
1 int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])   2 {   3     _tsetlocale(LC_ALL,_T("chs") );   4     system("title ReturnsMe的win32api测试程序");     5   6     HANDLE h[10];   7     //创建一个互斥,通常情况下有名字,因为open得时候会用到   8     HANDLE hMutex = CreateMutex(NULL,TRUE,_T("super7dd"));   9     for (int i=0;i<10;i++)  10     {  11         h[i] = chBEGINTHREADEX(NULL,NULL,SetThread,NULL,0,NULL);    12     }  13     Sleep(2000);  14     ReleaseMutex(hMutex);  15       16     WaitForMultipleObjects(10,h,TRUE,INFINITE);  17     system("pause");  18     return 0;  19 }  20  21 DWORD WINAPI SetThread()  22 {  23  24     HANDLE hMutex;   25     //打开一个互斥,不请求占有。  26     hMutex = OpenMutex(MUTEX_ALL_ACCESS ,FALSE,_T("super7dd"));  27     if (hMutex == NULL)  28     {  29         wprintf(_T("Mutex:super7dd cannot be opened %d\n"),GetLastError());  30         return 0;  31     }  32     //等待互斥触发  33     WaitForSingleObject(hMutex,INFINITE);  34     //再次打开,占有  35     OpenMutex(NULL,TRUE,_T("super7dd"));  36     wprintf(_T("am the thread \n"));  37     Sleep(1000);  38     //释放这个互斥  39     ReleaseMutex(hMutex);  40     return 0;  41 }....


原创粉丝点击