使用信号量进行线程同步

简介:
 
  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,如需转载请自行联系原作者

相关文章
|
运维 API 计算机视觉
深度解密协程锁、信号量以及线程锁的实现原理
深度解密协程锁、信号量以及线程锁的实现原理
213 2
利用信号量实现线程顺序执行
【8月更文挑战第24天】本文介绍了如何运用信号量确保多线程程序中线程按预定顺序执行的方法。信号量作为同步机制,可有效控制共享资源访问,防止数据不一致。实现步骤包括:引入必要的头文件(如 `&lt;pthread.h&gt;` 和 `&lt;semaphore.h&gt;`),定义信号量变量(如 `sem_t` 类型),初始化信号量(通常第一个信号量设为1,其余设为0),以及创建线程(每个线程执行特定任务并释放相应信号量)。
210 1
|
安全 C++
利用信号量实现线程顺序执行
【8月更文挑战第25天】信号量是多线程编程中用于控制共享资源访问的关键同步机制,能有效保证线程按预设顺序执行。实现方法包括:引入相关头文件(如 C++ 中的 `&lt;semaphore.h&gt;`),创建信号量并通过 `sem_init` 设置初始值;在各线程函数中运用 `sem_post` 与 `sem_wait` 来传递执行权;最后,通过 `sem_destroy` 销毁信号量以释放资源。使用过程中需注意错误处理、确保线程安全及合理设定信号量初值,以维持程序稳定性和高效性。
201 1
|
Java 数据中心 微服务
Java高级知识:线程池隔离与信号量隔离的实战应用
在Java并发编程中,线程池隔离与信号量隔离是两种常用的资源隔离技术,它们在提高系统稳定性、防止系统过载方面发挥着重要作用。
399 0
|
数据采集 Java Python
python 递归锁、信号量、事件、线程队列、进程池和线程池、回调函数、定时器
python 递归锁、信号量、事件、线程队列、进程池和线程池、回调函数、定时器
|
API
java-多线程-CountDownLatch(闭锁) CyclicBarrier(栅栏) Semaphore(信号量)-
java-多线程-CountDownLatch(闭锁) CyclicBarrier(栅栏) Semaphore(信号量)-
130 1
|
安全 Java API
多线程(JUC, ReentrantLock, 原子类, 线程池, 信号量 Semaphore, CountDownLatch)
多线程(JUC, ReentrantLock, 原子类, 线程池, 信号量 Semaphore, CountDownLatch)
149 4
|
监控 Cloud Native Java
通用快照方案问题之Hystrix和Ribbon在超时设置上的冲突如何解决
通用快照方案问题之Hystrix和Ribbon在超时设置上的冲突如何解决
225 0
|
算法 安全 Unix
【C++ 20 信号量 】C++ 线程同步新特性 C++ 20 std::counting_semaphore 信号量的用法 控制对共享资源的并发访问
【C++ 20 信号量 】C++ 线程同步新特性 C++ 20 std::counting_semaphore 信号量的用法 控制对共享资源的并发访问
480 0
信号量(Semaphore)与线程计数器(CountDownLatch)(详解)
信号量(Semaphore)与线程计数器(CountDownLatch)(详解)
129 0
信号量(Semaphore)与线程计数器(CountDownLatch)(详解)

热门文章

最新文章