日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

内核对象之信号量

發布時間:2025/3/8 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 内核对象之信号量 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自:http://blog.csdn.net/morewindows/article/details/7481609

步驟:

  1、CreateSemaphore,創建信號量

  2、WaitForSingleObject,獲得信號量,使信息量減少

  3、ReleaseSemaphore,增加當前信號量的資源計數,表示有多少個線程正在運行,使信號量增加。

對信號量的個人理解:

  1、用來計數

  2、用來同步

  3、將ReleaseSemaphore放在一個線程的開頭

  4、信號量與事件內核對象有相同的同步功能

  5、由此可以更能加深對互斥量的認識,它能夠解決“遺棄”問題,說明了互斥量的強大。?

代碼:

#include <stdio.h> #include <process.h> #include <windows.h> long g_nNum; unsigned int __stdcall Fun(void *pPM); const int THREAD_NUM = 10; //信號量與關鍵段 HANDLE g_hThreadParameter; CRITICAL_SECTION g_csThreadCode; int main() {printf(" 經典線程同步 信號量Semaphore\n");printf(" -- by MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n");//初始化信號量和關鍵段g_hThreadParameter = CreateSemaphore(NULL, 0, 1, NULL);//當前0個資源,最大允許1個同時訪問InitializeCriticalSection(&g_csThreadCode);HANDLE handle[THREAD_NUM]; g_nNum = 0;int i = 0;while (i < THREAD_NUM) {handle[i] = (HANDLE)_beginthreadex(NULL, 0, Fun, &i, 0, NULL);WaitForSingleObject(g_hThreadParameter, INFINITE);//等待信號量>0++i;}WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE);//銷毀信號量和關鍵段DeleteCriticalSection(&g_csThreadCode);CloseHandle(g_hThreadParameter);for (i = 0; i < THREAD_NUM; i++)CloseHandle(handle[i]);return 0; } unsigned int __stdcall Fun(void *pPM) {int nThreadNum = *(int *)pPM;Sleep(50);//some work should to doEnterCriticalSection(&g_csThreadCode);++g_nNum;Sleep(0);//some work should to doprintf("線程編號為%d 全局資源值為%d\n", nThreadNum, g_nNum);LeaveCriticalSection(&g_csThreadCode);ReleaseSemaphore(g_hThreadParameter, 1, NULL);//信號量++return 0; }

?結果:

思考:

  當ReleaseSemaphore時,如果給第二個參數傳入>1的數,則該程序停止了,看MSDN發現,如果第二個參數傳入的值,會導致信號量的數量超過最大值,則不能成功執行。這就有問題了。信號資源只不過不能釋放而已,還有其它資源也還是可以用的,為什么,這一個信號量沒有釋放,其它就不能得到信號,也許這就是信號源可以同步的原因,那么其實信號量同事件是差不多的,只不過在同步的時候,能夠計數,計量的是已經在運行的線程數,也即是保證了最大的線程運行數,當超過這個數量的時候,就不再允許再創建,所以這個同步機制,多用于服務器,基于這種考慮,所以我們應該將ReleaseSemaphore放在線程的開頭,以達到充分利用的目的。

轉載于:https://www.cnblogs.com/wang-can/p/3334842.html

總結

以上是生活随笔為你收集整理的内核对象之信号量的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。