C 多執行緒執行緒同步問題

2021-10-08 22:47:14 字數 1505 閱讀 5365

程序通常被定義為乙個正在執行的程式的例項,是乙個程式在其自身位址空間中的一次執行活動。

程序從來不執行任何東西,它是執行緒的容器。若要程序完成某項操作它必須擁有乙個在它的環境中執行的執行緒,此執行緒負責包含執行包含在程序位址空間中的**

現存由執行緒的核心物件和執行緒棧兩部分組成。作業系統用執行緒的核心物件來管理執行緒,核心物件也是系統用來存放執行緒統計資訊的地方。執行緒棧用來維護程式在執行**是所需要的所有函式引數和區域性變數。

c++11之前,c++庫中沒有提供和執行緒相關的類或者介面,因此在編寫多執行緒程式時,windows上需要呼叫createthread建立執行緒。

c++11之後提供了thread執行緒類,可以很方便的編寫多執行緒程式。下面**中就是使用了thread類。

在講執行緒同步問題時經常舉得乙個例子是火車票銷售。我們現在也用這個例子簡單的**如下。總共有100張火車票,兩個執行緒同步銷售。

#include #include #include using namespace std;

void fun1proc();

void fun2proc();

int tickets = 100;

void main()

void fun1proc()

else

break;

}}void fun2proc()

else

break;

}}

上述**因為有共享資源tickets,存在乙個隱患是:當tickets==1時,如果執行緒1執行完if(tickets>0)就時間片到期了,作業系統會讓執行緒2執行,而這時tickets的值還沒有減1,執行緒2進行判斷,滿足大於0,然後賣票,減1,tickets=0,這時又輪到執行緒1執行,執行緒1從上次暫停的地方執行,列印出來0,即執行緒1賣了號碼為0的票。(**執行緒中加入sleep是為了便於復現這種問題。)

為了避免共享資源在使用期間被其他執行緒改變,需要在多個執行緒之間進行乙個同步處理,保證乙個執行緒訪問共享資源時其他執行緒不能訪問該資源。互斥鎖(mutex)屬於核心物件,它能夠確保執行緒擁有對單個資源的互斥訪問權。

在上述**中使用互斥物件,在main函式前定義全域性變數互斥變數,**如下

mutex mtx;
mtx.lock();
執行緒1和執行緒2的break後,釋放互斥鎖。

mtx.unlock();
這時執行緒1執行到sleep時,暫停執行,執行緒2開始執行,執行到mtx.lock()時,因為執行緒1擁有互斥物件,執行緒2只能一直等待,直到執行緒1睡眠時間到了之後繼續往下執行,最後釋放互斥物件,這時執行緒2擁有了互斥物件的所有權,結束等待往下執行。不會出現兩個執行緒同時訪問資源而導致的異常問題。

但是互斥鎖使用不當有時候也會造成死鎖問題。這個將在另一篇文章裡單獨講。

多執行緒同步問題

在應用程式中使用多個執行緒的乙個好處是每個執行緒都可以非同步執行。對於 windows 應用程式,耗時的任務可以在後台執行,而使應用程式視窗和控制項保持響應。對於伺服器應用程式,多執行緒處理提供了用不同執行緒處理每個傳入請求的能力。否則,在完全滿足前乙個請求之前,將無法處理每個新請求。然而,執行緒的...

多執行緒同步問題

有四個執行緒1,2,3,4,執行緒1的功能就是輸出1,執行緒2的功能就是輸出2,以此類推.現在有四個檔案.abcd.初始都為空.現要讓四個檔案呈如下格式 a 1 2 3 4 1 2.b 2 3 4 1 2 3.c 3 4 1 2 3 4.d 4 1 2 3 4 1.設計程式.include sys ...

多執行緒 同步問題

我們先看個錯誤示例。功能 宣告乙個數字並賦值10000.然後讓1w個執行緒去減少1,1w個執行緒去增加1。理論上說,加一萬減一萬,最後數字的結果並不會改變。class errordemo 釋放object的方法 synchronized 塊結束或者異常丟擲。使用synchronized後的 publ...