2015-10-31 51 views
2

這裏僵局是我的源代碼:我應該修改,以防止對C++線程

#include "stdio.h" 
#include <stdlib.h> 
#include <string.h> 
#include "thread" 
#include "mutex" 

int count0=0 ,count1 =0; 
std::mutex main_thread; 
std::unique_lock<std::mutex> lck(main_thread, std::defer_lock); 

void Function00(long millisecond){ 

    while (true){ 

     lck.lock(); 
     count1++; 
     printf("count0:%d count1:%d \n",count0,count1); 
     lck.unlock(); 
     std::this_thread::sleep_for(std::chrono::milliseconds(millisecond)); 

    } 
} 

void Function01(){ 

    std::thread th(Function00, 1000);//count per 1 s 

    do{ 
     lck.lock(); 
     count0++; 
     lck.unlock(); 
     std::this_thread::sleep_for(std::chrono::milliseconds(500));//count per 0.5 s 
    } while (1); 

} 



int main(int argc, char *argv[]) 
{ 
    Function01(); 


    return 0; 
} 

我然後使用命令來建立我的.o文件:

g++ -std=c++11 -pthread testa.cpp -o a.o

然而,它顯示了錯誤:

terminate called after throwing an instance of 'std::system_error' 
    what(): Resource deadlock avoided 
Aborted 

我感到迷惑,也不知道去解決它,所以我嘗試在Microsoft VS2013,並沒有錯誤運行...我覺得confus電子郵件。這是在Linux的問題?我應該修改哪些內容來防止僵局?

+0

你兩次鎖定'lck'。你絕對不應該這樣做 – ForceBru

+0

你的意思是我需要創建另一個線程? –

+0

如果我使用函數在每次運行時創建線程,它會發生死鎖嗎? –

回答

4

unique_lock無法鎖定兩次,如果要鎖定兩個線程上的互斥鎖,以便其中一個鎖定,您需要使用兩個unique_lock s。

void Function00(long millisecond){ 

    while (true){ 

     { 
      std::unique_lock<std::mutex> lck(main_thread); 
      count1++; 
      printf("count0:%d count1:%d \n",count0,count1); 
     } 
     std::this_thread::sleep_for(std::chrono::milliseconds(millisecond)); 

    } 
} 

void Function01(){ 

    std::thread th(Function00, 1000);//count per 1 s 

    do{ 
     { 
      std::unique_lock<std::mutex> lck(main_thread); 
      count0++; 
     } 
     std::this_thread::sleep_for(std::chrono::milliseconds(500));//count per 0.5 s 
    } while (1); 

} 
+0

我很抱歉,我是它的初學者,所以我需要創建兩個線程? –

+2

@問題-erXDD:不,你只需要一個'unique_lock'每個線程。 – Dani

+0

如果有多個函數(例如> 4)同時工作,一個線程可以爲所有人完成這個工作嗎? –