互斥類型 | 解釋 |
---|---|
mutex(C++11) | 提供基本互斥設(shè)施(類) |
timed_mutex(C++11) | 提供互斥設(shè)施,實(shí)現(xiàn)有時(shí)限鎖定(類) |
recursive_mutex(C++11) | 提供能被同一線程遞歸鎖定的互斥設(shè)施(類) |
recursive_timed_mutex(C++11) | 提供能被同一線程遞歸鎖定的互斥設(shè)施,并實(shí)現(xiàn)有時(shí)限鎖定(類) |
shared_mutex(C++17) | 提供共享互斥設(shè)施(類) |
shared_timed_mutex(C++14) | 提供共享互斥設(shè)施并實(shí)現(xiàn)有時(shí)限鎖定(類) |
互斥管理 | 解釋 |
---|---|
lock_guard(C++11) | 實(shí)現(xiàn)嚴(yán)格基于作用域的互斥體所有權(quán)包裝器(類模板) |
scoped_lock (C++17) | 用于多個(gè)互斥體的免死鎖 RAII 封裝器(類模板) |
unique_lock (C++11) | 實(shí)現(xiàn)可移動的互斥體所有權(quán)包裝器(類模板) |
shared_lock(C++14) | 實(shí)現(xiàn)可移動的共享互斥體所有權(quán)封裝器(類模板) |
defer_lock_t(C++11) try_to_lock_t(C++11) adopt_lock_t(C++11) | 用于指定鎖定策略的標(biāo)簽類型(類) |
defer_lock(C++11) try_to_lock(C++11) adopt_lock(C++11) | 用于指定鎖定策略的標(biāo)簽常量(常量) |
#include#include
2、std::recursive_mutex
#include#include#includeclass X {std::recursive_mutex m;
std::string shared;
public:
void fun1() {std::lock_guardlk(m);
shared = "fun1";
std::cout<< "in fun1, shared variable is now "<< shared<< '\n';
}
void fun2() {std::lock_guardlk(m);
shared = "fun2";
std::cout<< "in fun2, shared variable is now "<< shared<< '\n';
fun1(); // 遞歸鎖在此處變得有用
std::cout<< "back in fun2, shared variable is "<< shared<< '\n';
};
};
int main()
{X x;
std::thread t1(&X::fun1, &x);
std::thread t2(&X::fun2, &x);
t1.join();
t2.join();
}
3、std::shared_mutex、std::shared_lock、std::unique_lock
C++17 std::shared_mutex的替代方案boost::shared_mutex
shared_mutex 類,結(jié)合 unique_lock 與 shared_lock 的使用,可以實(shí)現(xiàn)讀寫鎖。
通常讀寫鎖需要完成以下功能:
對應(yīng)于功能1,2我們可以這樣來描述:
#include#include#includeusing namespace std;
typedef std::shared_lockread_lock;
typedef std::unique_lockwrite_lock;
std::shared_mutex read_write_mutex;
int32_t g_data =0;
//線程A,讀data
void fun1()
{for (size_t i = 0; i< 10; i++)
{read_lock rlock(read_write_mutex);
cout<< "t1:g_data="<< g_data<< endl;
}
}
//線程B,讀data
void fun2()
{for (size_t i = 0; i< 10; i++)
{read_lock rlock(read_write_mutex);
std::cout<<"t2:g_data="<< g_data<< endl;
}
}
//線程C,寫data
void fun3()
{for (size_t i = 0; i< 10; i++)
{write_lock rlock(read_write_mutex);
g_data++;
std::cout<< "t3:g_data="<< g_data<< endl;
}
}
int main()
{thread t3(fun3);
thread t1(fun1);
thread t2(fun2);
t1.join();
t2.join();
t3.join();
}
輸出如下
結(jié)果說明:
簡單總結(jié)下
lock_guard:更加靈活的鎖管理類模板,構(gòu)造時(shí)是否加鎖是可選的,在對象析構(gòu)時(shí)如果持有鎖會自動釋放鎖,所有權(quán)可以轉(zhuǎn)移。對象生命期內(nèi)允許手動加鎖和釋放鎖。
scope_lock:嚴(yán)格基于作用域(scope-based)的鎖管理類模板,構(gòu)造時(shí)是否加鎖是可選的(不加鎖時(shí)假定當(dāng)前線程已經(jīng)獲得鎖的所有權(quán)),析構(gòu)時(shí)自動釋放鎖,所有權(quán)不可轉(zhuǎn)移,對象生存期內(nèi)不允許手動加鎖和釋放鎖。
share_lock:用于管理可轉(zhuǎn)移和共享所有權(quán)的互斥對象。
參考:
1、https://www.apiref.com/cpp-zh/cpp/thread.html
2、https://en.cppreference.com/w/cpp/thread
3、書籍《c++服務(wù)器開發(fā)精髓》——張遠(yuǎn)龍
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
分享題目:【并發(fā)編程九】c++線程同步——互斥(mutex)-創(chuàng)新互聯(lián)
轉(zhuǎn)載注明:http://chinadenli.net/article26/ddijcg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、商城網(wǎng)站、網(wǎng)站改版、搜索引擎優(yōu)化、虛擬主機(jī)、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容