99热这里只有精品2-99热这里只有精品6免费-99热这里只有精品国产99-99热这里只有精品国产99热门精品-99热这里只有精品国产动漫

編程代碼
新聞詳情

C++11多線程編程(八)——死鎖問題

發布時間:2021-01-07 14:00:41 瀏覽次數:2829

一、死鎖現象

看到“死鎖”二字,你是不是慌得不知所措。死鎖,顧名思義就是這個鎖死掉了,再也動不了了。那死鎖是怎么產生的呢?當你對某個資源上鎖后,卻遲遲沒有釋放或者根本就無法釋放,導致別的線程無法獲得該資源的訪問權限,進而程序無法運行下去,有點像是阻塞的現象。但是阻塞是一種正常現象,而死鎖可以說是一種bug,必須要處理。

C++11多線程編程(八)——死鎖問題

那么我現在就舉個死鎖的例子,來分析分析。

#include <iostream>
#include <thread>
#include <mutex>
using namespace std;
 
mutex mt1;
mutex mt2;
void thread1()
{
    cout << "thread1 begin" << endl;
    lock_guard<mutex> guard1(mt1);
    this_thread::sleep_for(chrono::seconds(1));
    lock_guard<mutex> guard2(mt2);
    cout << "hello thread1" << endl;
}
void thread2()
{
    cout << "thread2 begin" << endl;
    lock_guard<mutex> guard1(mt2);
    this_thread::sleep_for(chrono::seconds(1));
    lock_guard<mutex> guard2(mt1);
    cout << "hello thread2" << endl;
}
 
int main()
{
    thread t1(thread1);
    thread t2(thread2);
    t1.join();
    t2.join();
    cout << "thread end" << endl;
    return 0;
}

二、死鎖分析

因為程序運行的是非常快的,所以為了產生死鎖現象,我們各自休眠了1秒。

運行以上程序可以發現,程序在輸出完“thread1 beginthread2 begin”后,就卡在那里,程序運行可能發生了以下這種情況:

thread1              thread2
mt1.lock()           mt2.lock()
//死鎖               //死鎖
mt2.lock()           mt1.lock()

thread1中的mt2在等待著thread2的mt2釋放鎖,而thead2中mt1卻也在等待著thread1的mt1釋放鎖,互相都在等待著對方釋放鎖,進而產生了死鎖。必須強調的是,這是一種bug,必須避免。那么如何避免這種情況呢?

三、死鎖解決

1、每次都先鎖同一個鎖

比如像上面thread1和thread2線程,我們每次都先鎖mt1,再鎖mt2,就不會發生死鎖現象。

2、給鎖定義一個層次的屬性,每次按層次由高到低的順序上鎖,這個原理也是每次都先鎖同一個鎖。

C++標準庫中提供了std::lock()函數,能夠保證將多個互斥鎖同時上鎖。

std::lock(mt1, mt2);

那么既然在最前面就已經上鎖了,后面就不需要上鎖了,而C++標準庫并沒有提供std::unlock()的用法,所以還是需要用到lock_guard,但是需要修改一點。加個std::adopt_lock就可以了。

lock_guard<mutex> guard1(mt1, adopt_lock);
lock_guard<mutex> guard2(mt2, adopt_lock);

這個表示構造函數的時候不要給我上鎖,到析構的時候你要記得給我解鎖。

這個就是死鎖的一些解決方法,同時大家一定要記得盡量不要一段定義域內多次使用互斥鎖,如果不可避免的要使用,一定要記得給鎖定義順序,或者使用要使用std::lock()上鎖。

相關閱讀:

在線客服 雙翌客服
客服電話
  • 0755-23712116
  • 13310869691
主站蜘蛛池模板: 精品国产一区二区三区在线观看| 国产小视频国产精品| 一级骚片| 黄色短视频免费| 国产呦精品一区二区三区网站| 亚洲 欧美 自拍 卡通 综合| 亚洲免费黄色网址| 欧美成人免费全部观看在线看| 国产普通话对白精品hd| 日韩精品第一页| 色综合999| 国产一级又色又爽又黄大片| 国产免费又色又爽又黄的网站| 日韩精品中文乱码在线观看 | 一本大道香蕉中文日本不卡高清二区 | 国产护士一级毛片高清| 国内免费视频成人精品| 日韩精品中文字幕一区二区三区| 1024在线视频| 一级毛片观看| 久久精品中文字幕有码日本| 午夜剧场福利| 亚洲爱v| 国产一级成人毛片| 国产精品无码永久免费888| 久草在线资源福利站| 日韩小视频在线播放| 亚洲精品欧美日本中文字幕| 91亚洲精品成人一区| 小蝌蚪在线成人免费视频| 在线播放国产一区二区三区| 欧美a级片免费看| 国产下药迷倒白嫩美女网站| 韩国一级黄色| 九九毛片| 免费的污污网站| 亚洲综合日韩欧美一区二区三| a级黄色毛片| 一区二区三区在线视频观看| 久久久受www免费人成| 日本一区二区在线不卡|