準備知識:1,核心物件互斥體(mutex)的工作機理,waitforsingleobject函式的用法,這些可以從msdn獲取詳情;2,當兩個或更多執行緒需要同時訪問乙個共享資源時,系統需要使用同步機制來確保一次只有乙個執行緒使用該資源。mutex 是同步基元,它只向乙個執行緒授予對共享資源的獨佔訪問權。如果乙個執行緒獲取了互斥體,則要獲取該互斥體的第二個執行緒將被掛起,直到第乙個執行緒釋放該互斥體。
下邊是我參考開源專案c++ sockets的**,寫的執行緒鎖類
lock.h
#ifndef _lock_h
#define _lock_h
#include
//鎖介面類
class imylock
public:
virtual ~imylock() {}
virtual void lock() const = 0;
virtual void unlock() const = 0;
//互斥物件鎖類
class mutex : public imylock
public:
mutex();
~mutex();
virtual void lock() const;
virtual void unlock() const;
private:
handle m_mutex;
//鎖
class clock
public:
clock(const imylock&);
~clock();
private:
const imylock& m_lock;
#endif
lock.cpp
#include "lock.h"
//建立乙個匿名互斥物件
mutex::mutex()
m_mutex = ::createmutex(null, false, null);
//銷毀互斥物件,釋放資源
mutex::~mutex()
::closehandle(m_mutex);
//確保擁有互斥物件的執行緒對被保護資源的獨自訪問
void mutex::lock() const
dword d = waitforsingleobject(m_mutex, infinite);
//釋放當前執行緒擁有的互斥物件,以使其它執行緒可以擁有互斥物件,對被保護資源進行訪問
void mutex::unlock() const
::releasemutex(m_mutex);
//利用c++特性,進行自動加鎖
clock::clock(const imylock& m) : m_lock(m)
m_lock.lock();
//利用c++特性,進行自動解鎖
clock::~clock()
m_lock.unlock();
下邊是測試**
// mylock.cpp : 定義控制台應用程式的入口點。
#include
#include
#include "lock.h"
using namespace std;
//建立乙個互斥物件
mutex g_lock;
//執行緒函式
unsigned int __stdcall startthread(void *pparam)
char *pmsg = (char *)pparam;
if (!pmsg)
return (unsigned int)1;
//對被保護資源(以下列印語句)自動加鎖
//執行緒函式結束前,自動解鎖
clock lock(g_lock);
for( int i = 0; i < 5; i++ )
cout << pmsg << endl;
sleep( 500 );
return (unsigned int)0;
int main(int argc, char* argv)
handle hthread1, hthread2;
unsigned int uithreadid1, uithreadid2;
char *pmsg1 = "first print thread.";
char *pmsg2 = "second print thread.";
//建立兩個工作執行緒,分別列印不同的訊息
//hthread1 = ::createthread(null, 0, (lpthread_start_routine)startthread, (void *)pmsg1, 0, (lpdword)&uithreadid1);
//hthread2 = ::createthread(null, 0, (lpthread_start_routine)startthread, (void *)pmsg2, 0, (lpdword)&uithreadid2);
hthread1 = (handle)_beginthreadex(null, 0, &startthread, (void *)pmsg1, 0, &uithreadid1);
hthread2 = (handle)_beginthreadex(null, 0, &startthread, (void *)pmsg2, 0, &uithreadid2);
//等待執行緒結束
dword dwret = waitforsingleobject(hthread1,infinite);
if ( dwret == wait_timeout )
terminatethread(hthread1,0);
dwret = waitforsingleobject(hthread2,infinite);
if ( dwret == wait_timeout )
terminatethread(hthread2,0);
//關閉執行緒控制代碼,釋放資源
::closehandle(hthread1);
::closehandle(hthread2);
system("pause");
return 0;
用vc2005編譯,啟動程式,下邊是截圖
如果將測執行緒函式中的**注視掉,重新編譯**,執行
clock lock(g_lock);
則結果見下圖
由此可見,通過使用mutex的封裝類,即可達到多執行緒同步的目的。因mutex屬於核心物件,所以在進行多執行緒同步時速度會比較慢,但是用互斥物件可以在不同程序的多個執行緒之間進行同步。
在實際應用中,我們通常還會用到關鍵**段critical_section,在下篇部落格中,我將會把關鍵**段鎖新增進來,並且對mutex和critical_section的效能做以比較
摘自 chexlong的專欄
用mutex同步多執行緒
include include dword winapi threadproc1 lpvoid lpparameter dword winapi threadproc2 lpvoid lpparameter int index 0 int tickets 100 handle hmutex int ...
C 多執行緒 Mutex
dotnet 2010 05 29 19 07 24 閱讀151 字型大小 大 中小訂閱 互斥鎖 mutex 互斥鎖是乙個互斥的同步物件,意味著同一時間有且僅有乙個執行緒可以獲取它。互斥鎖可適用於乙個共享資源每次只能被乙個執行緒訪問的情況 函式 建立乙個處於未獲取狀態的互斥鎖 public mute...
C 實現mutex 互斥鎖
思路 實現mutex最重要的就是實現它的lock 方法和unlock 方法。我們儲存乙個全域性變數flag,flag 1表明該鎖已經鎖住,flag 0表明鎖沒有鎖住。實現lock 時,使用乙個while迴圈不斷檢測flag是否等於1,如果等於1就一直迴圈。然後將flag設定為1 unlock 方法就...