信號量

信號量和互斥量相同,不過互斥量每次只允許一個線程訪問共享資源,而信號變量則是允許一個或多個線程同時存取共享資源。

線程需要同步的原因:1.線程之間競爭共享的資源;
2.爲完成某個任務而需要協作;
通過互斥可完成線程之間的公共資源競爭,事件完成協調;而信號量則將互斥和事件結合起來,同時解決了競爭和協作問題。
信號量兩大核心操作是提高計數值和降低計數值。DOWN操作是檢查信號量的計數值大於0,則線程繼續運行,否則線程由於獲取不到信號量,進入睡眠狀態;
UP操作是用於線程釋放對信號量的所有權,提高信號量的計數值。
CreateSemaphore():創建一個信號量;
OpenSemaphore()打開一個已創建的信號量;
ReleaseSemaphore()釋放對信號量的所有權;
http://blog.csdn.net/blues1021/article/details/44548115

#include <iostream>
#include <process.h>
#include <Windows.h>
using namespace std;
HANDLE hSemaphore;

DWORD WINAPI MyThread1(LPVOID lp1);
DWORD WINAPI myThread2(LPVOID lp);

DWORD WINAPI MyThread1(LPVOID lp1)
{
  int *pNo=(int *)lp1;

  WaitForSingleObject(hSemaphore,INFINITE
      );

  cout<<"***Thread#"<<*pNo<<"GET the Semaphore"<<endl;
  Sleep(1000*(*pNo));

  cout<<"***Thread #"<<*pNo<<"Release Semaphore"<<endl;

  ReleaseSemaphore(hSemaphore,1,NULL);
  return 1;
}


int main(int argc,char*argv[])
{
   int ThrdNo[6];
   DWORD dw;

   hSemaphore=CreateSemaphore(NULL,3,3,NULL);


   for (int i=0;i<6;i++)
   {
       ThrdNo[i]=i+1;
       CreateThread(NULL,0,MyThread1,&ThrdNo[i],NULL,&dw);
   }
   Sleep(60000);
   return 0;
}

這裏喚醒的線程是隨機的,這裏值得注意

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章