用C 實現多執行緒Mutex鎖

2021-06-13 19:10:25 字數 3603 閱讀 8705

準備知識: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 方法就...