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

信号量,资源计数为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 }....


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值