1. 程式人生 > >【多執行緒之二】CreateMutex()互斥體

【多執行緒之二】CreateMutex()互斥體

某修學習多執行緒第二個知識點,這裡再做個筆記。

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呢?也就是先執行子程序呢?

這個問題,再做研究吧。。。