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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

win32 临界区和简单实例Demo(win32版)

發布時間:2025/4/14 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 win32 临界区和简单实例Demo(win32版) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一 win32 臨界區

臨界區是一種防止多個線程同時執行一個特定代碼段的機制。如果有多個線程試圖同時訪問臨界區,那么在有一個線程進入后其他的所有試圖訪問此臨界區的線程將被掛起,并且一直持續到進入臨界區的線程離開。
臨界區適用于多個線程操作之間沒有先后順序但要求互斥的同步。

多個線程訪問同一個臨界區的原則:
1、一次最多只能一個線程停留在臨界區內。
2、不能讓一個線程無限的停留在臨界區內,否則其它線程將不能進入臨界區。

定義臨界區變量的方法如下:
CRITICAL_SECTION critical_section;
通常情況下,CRITICAL_SECTION結構體應該被定義為全局變量,便于進程中的所有線程可以按照變量名來引用此結構體。

相關的API包括:
初始化臨界區:
VOID WINAPI InitializeCriticalSection(LPCIRITICAL_SECTION lpCriticalSection);
刪除臨界區:
VOID WINAPI DeleteCriticalSection(LPCIRITICAL_SECTION lpCriticalSection);
進入臨界區:
VOID WINAPI EnterCriticalSection(LPCIRITICAL_SECTION lpCriticalSection);
離開臨界區:
VOID WINAPI LeaveCriticalSection(LPCIRITICAL_SECTION lpCriticalSection);

使用臨界區的一般方法是:
void WriteData()
{
?? ?EnterCriticalSection(&critical_section);
?? ?doSomething();
?? ?LeaveCriticalSection(&critical_section);
}

二 實例

#include <windows.h>int total = 100; HANDLE evhandle[2]; CRITICAL_SECTION cs;void WithDrawThread1(LPVOID param) {EnterCriticalSection(&cs);if (total - 90 >= 0){total -= 90;MessageBox(NULL,"You get $90",TEXT("線程1"),0);}else{MessageBox(NULL,"You haven't right to withdraw so much money",TEXT("線程1"),0);}LeaveCriticalSection(&cs);SetEvent(evhandle[0]); }void WithDrawThread2(LPVOID param) {EnterCriticalSection(&cs);if (total - 20 >= 0){total -= 20;MessageBox(NULL,"You get $20",TEXT("線程2"),0);}else{MessageBox(NULL,"You haven't right to withdraw so much money",TEXT("線程2"),0);}LeaveCriticalSection(&cs);SetEvent(evhandle[1]); }int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) {/* TODO: Place code here. by bo*/char szBuffer[100]; evhandle[0] = CreateEvent(NULL,FALSE,FALSE,NULL);evhandle[1] = CreateEvent(NULL,FALSE,FALSE,NULL);InitializeCriticalSection(&cs);_beginthread(WithDrawThread1,0,NULL);_beginthread(WithDrawThread2,0,NULL);WaitForMultipleObjects(2,evhandle,TRUE,INFINITE);DeleteCriticalSection(&cs);wsprintf(szBuffer, "%d",total);MessageBox(NULL,szBuffer,TEXT("total"),0);return 0; }

運行情況;

程序有兩個線程;每個線程都要操作變量total;total初始值為100;線程,是同時執行的;

線程1先進入臨界區,操作total,此時線程2不能操作total;線程1對total減去90,提示"You get $90";然后total的值為10;

然后線程1退出臨界區,線程2進入臨界區,線程2開始操作total;

此時 10-20,小于0;所以線程2提示?"You haven't right to withdraw so much money";

線程2執行完,退出臨界區;

程序繼續執行,提示最終的total值:10;

工程;

?

?

總結

以上是生活随笔為你收集整理的win32 临界区和简单实例Demo(win32版)的全部內容,希望文章能夠幫你解決所遇到的問題。

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