欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c++多線程之死鎖的發(fā)生的情況解析(包含兩個歸納,6個示例)

 更新時間:2018年01月30日 23:25:46   投稿:mdxy-dxy  
這篇文章主要介紹了c++多線程之死鎖的發(fā)生的情況解析(包含兩個歸納,6個示例),需要的朋友可以參考下

一、死鎖會在什么情況發(fā)生

1、假設有如下代碼

mutex;  //代表一個全局互斥對象
  void A()
   {
     mutex.lock();
     //這里操作共享數(shù)據(jù)
     B(); //這里調(diào)用B方法
     mutex.unlock();
     return;
   }
 
  void B()
   {
     mutex.lock();
     //這里操作共享數(shù)據(jù)
     mutex.unlock();
     return;
   }

此時會由于在A、B方法中相互等待unlock而導致死鎖。

2、假設有如何代碼

mutex;  //代表一個全局互斥對象
  void A()
   {
     mutex.lock();
     //這里操作共享數(shù)據(jù)
      if(.....)
     {
       return;
      }
     mutex.unlock();
     return;
   }

由于在if的執(zhí)行體內(nèi)直接retun,而沒有調(diào)用unlock,導致另一個線程再調(diào)用A方法就出現(xiàn)死鎖。

二、另一個總結(jié)

不管什么原因,死鎖的危機都是存在的。那么,通常出現(xiàn)的死鎖都有哪些呢?我們可以一個一個看過來,

(1)忘記釋放鎖

void data_process() 
{ 
  EnterCriticalSection();  
  if(/* error happens */) 
    return;  
  LeaveCriticalSection(); 
} 

(2)單線程重復申請鎖

void sub_func() 
{ 
  EnterCriticalSection(); 
  do_something(); 
  LeaveCriticalSection(); 
} 
 
void data_process() 
{ 
  EnterCriticalSection(); 
  sub_func(); 
  LeaveCriticalSection(); 
} 

(3)雙線程多鎖申請

void data_process1() 
{ 
  EnterCriticalSection(&cs1); 
  EnterCriticalSection(&cs2); 
  do_something1(); 
  LeaveCriticalSection(&cs2); 
  LeaveCriticalSection(&cs1); 
} 
 
void data_process2() 
{ 
  EnterCriticalSection(&cs2); 
  EnterCriticalSection(&cs1); 
  do_something2(); 
  LeaveCriticalSection(&cs1); 
  LeaveCriticalSection(&cs2); 
} 

(4)環(huán)形鎖申請

/*
* A - B
* | |
* C - D
*/

假設有A、B、C、D四個人在一起吃飯,每個人左右各有一只筷子。所以,這其中要是有一個人想吃飯,他必須首先拿起左邊的筷子,再拿起右邊的筷子?,F(xiàn)在,我們讓所有的人同時開始吃飯。那么就很有可能出現(xiàn)這種情況。每個人都拿起了左邊的筷子,或者每個人都拿起了右邊的筷子,為了吃飯,他們現(xiàn)在都在等另外一只筷子。此時每個人都想吃飯,同時每個人都不想放棄自己已經(jīng)得到的一那只筷子。所以,事實上大家都吃不了飯。

總結(jié):

(1)死鎖的危險始終存在,但是我們應該盡量減少這種危害存在的范圍
(2)解決死鎖花費的代價是異常高昂的
(3)最好的死鎖處理方法就是在編寫程序的時候盡可能檢測到死鎖
(4)多線程是一把雙刃劍,有了效率的提高當然就有死鎖的危險
(5)某些程序的死鎖是可以容忍的,大不了重啟機器,但是有些程序不行

相關(guān)文章

  • C++遍歷文件夾下所有文件的多種方法

    C++遍歷文件夾下所有文件的多種方法

    這篇文章主要介紹了C++遍歷文件夾下所有文件的多種方法,需要的朋友可以參考下
    2018-01-01
  • C++課程設計之學生成績管理系統(tǒng)

    C++課程設計之學生成績管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C++課程設計之學生成績管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 關(guān)于C語言中E-R圖的詳解

    關(guān)于C語言中E-R圖的詳解

    今天小編就為大家分享一篇關(guān)于關(guān)于C語言中E-R圖的詳解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • C++入門指南之貪吃蛇游戲的實現(xiàn)

    C++入門指南之貪吃蛇游戲的實現(xiàn)

    這篇文章主要給大家介紹了關(guān)于C++入門指南之貪吃蛇游戲?qū)崿F(xiàn)的相關(guān)資料,文章通過示例代碼介紹的非常詳細,可以讓大家能短時間內(nèi)寫出一個貪吃蛇,需要的朋友可以參考下
    2021-10-10
  • C語言算法練習之佩奇借書

    C語言算法練習之佩奇借書

    這篇文章主要該大家分享C語言佩奇借書的練習,文章主要通過描述佩奇借書的問題然后確定程序框架將結(jié)果運算出來,下面來看詳細內(nèi)容吧,需要的朋友可以參考一下
    2022-03-03
  • C語言實現(xiàn)學生選課系統(tǒng)

    C語言實現(xiàn)學生選課系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)學生選課系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • C++中的內(nèi)存對齊實例詳解

    C++中的內(nèi)存對齊實例詳解

    這篇文章主要介紹了C++中的內(nèi)存對齊實例詳解的相關(guān)資料,這里不僅提供實現(xiàn)方法及代碼還提供了手工制作圖,來幫助到大家理解這部分知識,需要的朋友可以參考下
    2017-07-07
  • C++之智能指針初步及棄用auto_ptr的原因分析

    C++之智能指針初步及棄用auto_ptr的原因分析

    這篇文章主要介紹了C++之智能指針初步及棄用auto_ptr的原因分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • C/C++ 多線程的學習心得總結(jié)

    C/C++ 多線程的學習心得總結(jié)

    本篇文章是對C/C++中多線程的學習心得總結(jié)進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 基于C語言編寫一個簡單的抽卡小游戲

    基于C語言編寫一個簡單的抽卡小游戲

    這篇文章主要為大家介紹了如何利用C語言實現(xiàn)原神抽卡的小游戲,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-04-04

最新評論