【多執行緒之二】CreateMutex()互斥體
阿新 • • 發佈:2019-02-16
某修學習多執行緒第二個知識點,這裡再做個筆記。
Mutex控制互斥體的一些函式的使用:
CreateMutex、ReleaseMutex、WaitForSingleObject。
CreateMutex()
功能:建立一個互斥體
VC宣告
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTESlpMutexAttributes, // 指向安全屬性的指標
BOOLbInitialOwner, // 初始化互斥物件的所有者
LPCTSTRlpName // 指向互斥物件名的指標
);
顯然看不懂,簡單化一下:
返回值:一個控制代碼~
第一個引數:先不管!預設!
第二個引數:
TRUE:訊號已被當前執行緒獲得,沒有釋放之前其他執行緒不能獲得。
FLASE:自由爭取。
第三個引數:互斥體名稱,大家可以自由取~(當然這裡,絕對絕對會出現問題的)········
ReleaseMutex()
功能:釋放一個互斥體
VC宣告
BOOL WIANPI ReleaseMutex(
HANDLE hMutex
);
這次的宣告倒是簡單很多;
返回值:bool型別,成功失敗不多說;
引數一:控制代碼
WaitForSingleObject()
功能:等待
VC宣告
DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
);
第一個引數:檔案控制代碼
第二個引數:等待時間(INFINITE,無限等待)
多執行緒程序的例子二
#include <iostream>
#include <Windows.h>
HANDLE hmutext;
DWORD WINAPI add(LPVOID Param)
{
while (1)
{
WaitForSingleObject(hmutext, INFINITE);
*(int*)Param -= 3;
std::cout << *(int*)Param << std::endl;
Sleep(1000);
ReleaseMutex(hmutext);
}
return 0 ;
}
int main(void)
{
int a = 10;
HANDLE hThread = CreateThread(NULL, 0, add, &a, 0, NULL);
hmutext = CreateMutex(NULL, false, L"huchiti");
CloseHandle(hThread);
while (1)
{
WaitForSingleObject(hmutext, INFINITE);
a += 5;
std::cout << a << std::endl;
Sleep(2000);
ReleaseMutex(hmutext);
}
return 0;
}
這個程式碼呢,就會嚴格執行a先加5再減去3的順序運行了,這就是互斥體~
但是, hmutext = CreateMutex(NULL, false, L”huchiti”)這裡,false的機制決定了,一開始的順序是由兩個執行緒搶佔的,到底是先+5,還是先-3,實在不好說清楚。如果現在需要先-3呢?也就是先執行子程序呢?
這個問題,再做研究吧。。。