使用信号量进行线程同步

简介:
 
  1. #include <windows.h> 
  2. #include <stdio.h> 
  3.  
  4. #define NUMTHREADS 4 
  5.  
  6. HANDLE hSemaphore; 
  7.  
  8. void UseSemaphore(void); 
  9. DWORD WINAPI SemaphoreThread(LPVOID lpParam); 
  10.  
  11. int main(void){ 
  12.     UseSemaphore(); 
  13.  
  14. void UseSemaphore(void){ 
  15.     HANDLE hThread[NUMTHREADS]; 
  16.     INT i; 
  17.     LONG lMax; 
  18.     CHAR cMax; 
  19.     printf("将创建%d个线程,获得信号量的线程可以向屏幕打印.\n请输入信号量的最大计数1-%d:",NUMTHREADS,NUMTHREADS); 
  20.     cMax = getch(); 
  21.     printf("%c\n",cMax); 
  22.     lMax = cMax & 0xF; 
  23.     if(lMax<0 || lMax>NUMTHREADS){ 
  24.         printf("请输入1-%d.\n",NUMTHREADS); 
  25.     } 
  26.     hSemaphore = CreateSemaphore(NULL,lMax,lMax,NULL); 
  27.     if(hSemaphore == NULL){ 
  28.         printf("Create Semaphorec error.(%d)\n",GetLastError()); 
  29.     } 
  30.     for(i=0;i<NUMTHREADS;i++){ 
  31.         hThread[i] = CreateThread(NULL,0,SemaphoreThread,&i,0,NULL); 
  32.         if(hThread[i] == NULL){ 
  33.             printf("Create Threads error.(%d)\n",GetLastError()); 
  34.             return
  35.         } 
  36.     } 
  37.     WaitForMultipleObjects(NUMTHREADS,hThread,TRUE,INFINITE); 
  38.  
  39. DWORD WINAPI SemaphoreThread(LPVOID lpParam){ 
  40.     DWORD dwWaitResult; 
  41.     BYTE lpRead[16]; 
  42.     DWORD j = 0; 
  43.     DWORD dwPreviousCount; 
  44.  
  45.     for(;j<3;j++){ 
  46.         Sleep(rand()%1000); 
  47.         dwWaitResult = WaitForSingleObject(hSemaphore,INFINITE); 
  48.         switch(dwWaitResult){ 
  49.         case WAIT_OBJECT_0: 
  50.             printf("\nProcess %d Gets Semaphore",GetCurrentThreadId()); 
  51.             break
  52.         default
  53.             printf("\nprocess %u wait error:%u",GetCurrentThreadId(),GetLastError()); 
  54.         } 
  55.         Sleep(rand()%1000); 
  56.         if(!ReleaseSemaphore(hSemaphore,1,&dwPreviousCount)) 
  57.         { 
  58.             printf("\nprocess %u Release Semaphore error:%d",GetCurrentProcessId(),GetLastError()); 
  59.         }else 
  60.         { 
  61.             printf("\nProcess %u Release Semaphore,previous count is %u",GetCurrentProcessId(),dwPreviousCount); 
  62.         } 
  63.     } 
  64.     return 1; 

 









本文转hackfreer51CTO博客,原文链接:http://blog.51cto.com/pnig0s1992/673401,如需转载请自行联系原作者

相关文章
|
19小时前
|
算法 安全 Unix
【C++ 20 信号量 】C++ 线程同步新特性 C++ 20 std::counting_semaphore 信号量的用法 控制对共享资源的并发访问
【C++ 20 信号量 】C++ 线程同步新特性 C++ 20 std::counting_semaphore 信号量的用法 控制对共享资源的并发访问
36 0
|
19小时前
|
数据处理 容器
RT-Thread快速入门-线程间同步之信号量
RT-Thread快速入门-线程间同步之信号量
35 0
|
19小时前
信号量(Semaphore)与线程计数器(CountDownLatch)(详解)
信号量(Semaphore)与线程计数器(CountDownLatch)(详解)
34 0
信号量(Semaphore)与线程计数器(CountDownLatch)(详解)
|
8月前
|
安全 调度 C语言
iOS多线程之GCD-同步、异步、并发、串行、线程组、栅栏函数、信号量等全网最全的总结
iOS多线程之GCD-同步、异步、并发、串行、线程组、栅栏函数、信号量等全网最全的总结
501 1
|
11月前
三个线程交替打印ABC100次问题思考之二,使用信号量的优雅实现
三个线程交替打印ABC100次问题思考之二,使用信号量的优雅实现
75 0
|
11月前
|
编译器
【玩转RT-Thread】线程间同步(一) 信号量
【玩转RT-Thread】线程间同步(一) 信号量
100 0
|
12月前
并发编程-17AQS同步组件之 Semaphore 控制并发线程数的信号量
并发编程-17AQS同步组件之 Semaphore 控制并发线程数的信号量
44 0
|
12月前
|
存储 设计模式 安全
【Linux】多线程 --- POSIX信号量+懒汉模式的线程池+其他常见锁
【Linux】多线程 --- POSIX信号量+懒汉模式的线程池+其他常见锁
|
消息中间件 存储 安全
探索FreeRTOS的功能:线程,消息队列,邮箱,信号量,互斥量,任务通知,延时,虚拟定时器
探索FreeRTOS的功能:线程,消息队列,邮箱,信号量,互斥量,任务通知,延时,虚拟定时器
1251 0
|
Java 开发者 Spring
服务隔离机制信号量与线程池隔离|学习笔记
快速学习服务隔离机制信号量与线程池隔离
301 0
服务隔离机制信号量与线程池隔离|学习笔记