点击(此处)折叠或打开

  1. #include <iostream>
  2. #include <Windows.h>
  3. const int Tn = 3;
  4. HANDLE hMutex[Tn];
  5. void PutStar(LPVOID param)
  6. {
  7.     int w = int(param);
  8.     int nxt = (w+1)%Tn;
  9.     while(1)
  10.     {
  11.         WaitForSingleObject(hMutex[w],INFINITE);
  12.         std::cout<<w<<std::endl;
  13.         ReleaseMutex(hMutex[nxt]);
  14.     }
  15. }
  16.  
  17. int main()
  18. {
  19.     HANDLE t[Tn];
  20.     for (int i=0;i<Tn;i++)
  21.     {
  22.         hMutex[i] = CreateMutex(NULL,TRUE,NULL);
  23.         t[i] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)PutStar,(LPVOID)i,0,NULL);
  24.     }
  25.     ReleaseMutex(hMutex[0]);
  26.     WaitForMultipleObjects(Tn,t,TRUE,INFINITE);
  27. }
本来是想循环输出0,1,2的,可是为什么只输出0呢?
思路是:
三个线程,三个互斥信号量;
线程1输出时先等待信号量1然后释放信号量2;
线程2输出时先等待信号量2然后释放信号量3;
线程3输出时先等待信号量3然后释放信号量1;
初始时每个信号量都是占用状态,首先在主线程中释放信号量1,这样三个线程就跑起来了。
11-08 06:20