MFC線程(四):線程同步訊號量(semaphore)

來源:互聯網
上載者:User

前面講的三種保持線程同步的方法是臨界區,事件,互斥.它們都有點類似,就是確保一次只有一個線程訪問資源,獨佔一個資源.

而訊號量就與它們不同,它是可以讓很多線程同時訪問一個資源,但是限制一次同時訪問的數量.這樣的資源一般是唯讀,所以不會造成資源的混亂.最簡單的例子就是資料庫中表的讀操作,可以多個線程同時去讀.而寫可不行(只能一次讓一個去寫).

在這Server的編程中蠻有用,限制同時訪問server的用戶端是多少個.

 

Win32 API中的semphore

 

HANDLE hSemaphore;

CString szInfo = _T("I am useful info");

 

void MainTest(){

hSemaphore = CreateSemaphore(NULL,2,2,NULL);  //只能同時兩個線程並發訪問

AfxBeginThread(FunOne,NULL);

AfxBeginThread(FunTwo,NULL);

//如果再多加一個線程有可能出錯,也可能不.假如恰好三個線程同時訪問就出錯,如果前面的某個已經訪問完了那不會出錯

}

 

UINT FunOne(LPVOID pParam){

WaitForSingleObject(hSemaphore, INFINITE);

CString info = szInfo;

ReleaseSemaphore(hSemaphore, 1, NULL);

}

 

UINT FunTwo(LPVOID pParam){

WaitForSingleObject(hSemaphore, INFINITE);

CString info = szInfo;

ReleaseSemaphore(hSemaphore, 1, NULL);

}

 

MFC中的semphore類

 

CSemaphore g_cSHE(2,2);

CString szInfo = _T("I am useful info");

void MainTest(){

AfxBeginThread(FunOne,NULL);

AfxBeginThread(FunTwo,NULL);

//如果再多加一個線程有可能出錯,也可能不.假如恰好三個線程同時訪問就出錯,如果前面的某個已經訪問完了那不會出錯

}

UINT FunOne(LPVOID pParam){

g_cSHE.Lock();

CString info = szInfo;

g_cSHE.Unlock();

}

UINT FunTwo(LPVOID pParam){

g_cSHE.Lock();

CString info = szInfo;

g_cSHE.Unlock();

}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.