Mutex與Event控制互斥事件的使用詳解

2021-06-27 00:41:59 字數 2777 閱讀 4786

最近寫一程式,誤用了mutex的功能,錯把mutex當event用了。

【mutex】

使用mutex的主要函式:createmutex、releasemutex、openmutex、waitforsingleobject、waitformultipleobjects。

【event】

與mutex不一樣,event是任何時候都是可以操作的,而且沒有同呼叫多次waitforsingleobject和同時釋放多次一說。它的主要操作函式有:createevent、setevent、waitforsingleobject。

createevent引數說明。

第二個引數表示呼叫waitforsingleobject後手動(true)/自動(false)為無訊號狀態。

第三個引數表示初始狀態為有(true)/無(false)訊號。

event的獲得是通過乙個佇列去排隊獲得的,setevent沒有限制使用,在任何可以呼叫的地方都可以呼叫。

mutex,的互斥是以執行緒為基本單位,而event是以**段為基本單位。所以在兩者的使用上有著不同的功能用途。

【測試**】

//

mutex_release.cpp : 定義控制台應用程式的入口點。

////

#include "

stdafx.h

"#include

"iostream

"#include

"windows.h

"using

namespace

std;

dword winapi threadproc1(lpvoid lpparam);

dword winapi threadproc2(lpvoid lpparam);

handle hevent =null;

handle hthread1 =null;

handle hthread2 =null;

int main(int argc,char *args)

//dword dreturn = waitforsingleobject(hevent,infinite);

//cout<< dreturn << endl;

//releasemutex(hevent);

//releasemutex(hevent);

while(1

)

return0;

}dword winapi threadproc1(lpvoid lpparam)

dreturn =waitforsingleobject(hevent,infinite);

if (wait_object_0 ==dreturn)

cout

<

in thread1 --signal

"<

//setevent(hevent);

//releasemutex(hevent);

//releasemutex(hevent);

while(1

)

return0;

}dword winapi threadproc2(lpvoid lpparam)

cout

<

in thread2--signal

"<

//setevent(hevent);

//setevent(hevent);

//releasemutex(hevent);

while(1

)

return0;

}//int _tmain(int argc, _tchar* argv)

////

//printf("create yes!\n");

//waitforsingleobject(m_hmutex, infinite);

//printf("wait yes\n");

////

//setevent(m_hmutex);

////

setevent(m_hmutex);

////

setevent(m_hmutex);

////

//releasemutex(m_hmutex);

////

releasemutex(m_hmutex);

////

releasemutex(m_hmutex);

////

waitforsingleobject(m_hmutex, infinite);

//printf("wait yes 2\n");

//waitforsingleobject(m_hmutex, infinite);

//printf("wait yes 3\n");

//waitforsingleobject(m_hmutex, infinite);

//printf("wait yes 4\n");

//waitforsingleobject(m_hmutex, infinite);

//printf("wait yes 5\n");

//waitforsingleobject(m_hmutex, infinite);

//printf("wait yes 6\n");

//waitforsingleobject(m_hmutex, infinite);

//printf("wait yes 7\n");

//return 0;

//}

世界如此的美好,江山如此的多嬌! ---陽光正能量--->>>>>>>>>>>>>>>

執行緒同步與互斥 互斥鎖(mutex)

在多執行緒訪問共享資料的時候可能會發生衝突,例如 衝突的例子 include include include includeint common data 0 公共資料 void increase data void vptr return null int main void err pthrea...

程序間互斥 Mutex

對於普通的執行緒間互斥可以使用createmutex傳建乙個匿名的互斥量做互斥,對程序間的互斥就要用到命名互斥量來做互斥了。用到的函式有 1.建立乙個命名互斥量使用createmutex 方法,只需把lpname引數設定為非null,如 my mutex handle winapi createmu...

linux之mutex 互斥鎖

在posix thread中定義有一套專門用於執行緒同步的mutex函式 有兩種方法建立互斥鎖,靜態方式和動態方式。posix定義了乙個巨集pthread mutex initializer來靜態初始化互斥鎖,方法如下 pthread mutex t mutex pthread mutex init...