C 使用多執行緒交替列印1 10

2021-09-29 19:22:30 字數 1738 閱讀 5536

使用多執行緒交替列印1-10,執行緒1列印奇數,執行緒2列印偶數,有兩種方式實現,一種是使用訊號量(即互斥鎖),另一種是不使用互斥量,人為控制number的讀寫。

以下為個人想法,可能有錯誤:

這是乙個面試很常見的題目,要求交替列印,使用互斥量的原理很簡單,就是確保乙個執行緒在對number進行操作的時候給number上鎖,使得其他執行緒不能訪問number,必須等該執行緒釋放number的鎖後,其他執行緒才能訪問number,一句話,使用鎖就是確保number操作的原子性。

而如果不使用鎖呢,如何手動控制number的原子性,我的想法是,在進入先判斷number的值,然後將number的值複製到temp_number,對temp_number進行操作,加1和輸出,最後操作都結束後,在將temp_number的值賦值給number,避免多次讀取number的值。其實分為三步,讀取備份–> 修改備份 --> 寫回number,結束。

下面是實現的**,主推方法1吧,畢竟這才是正規標準的寫法。而方法2沒有使用訊號量,算是自己胡思亂想的嘗試,而且面試也不推薦寫方法2的**,不使用訊號量估計會被面試官錘!!!

#include

#include

#include

using

namespace std;

int number;

mutex mutex_number;

const

int maxnum =10;

// 列印奇數

void

add_1()

if(number %2==

0)mutex_number.

unlock()

;}cout <<

"mythread_1 finish"

<< endl;

// mythread_1完成

}// 列印偶數

void

add_2()

if(number %2==

1)mutex_number.

unlock()

;}cout <<

"mythread_2 finish"

<< endl;

// mythread_2完成

// 輸出範圍:1 - maxnum

// 列印奇數

void

add_1()

}}cout <<

"mythread_1 finish"

<< endl;

// mythread_1完成

}// 列印偶數

void

add_2()

}}cout <<

"mythread_2 finish"

<< endl;

// mythread_2完成

多執行緒 LeetCode 交替列印FooBar

我們提供乙個類 class foobar public void bar 兩個不同的執行緒將會共用乙個 foobar 例項。其中乙個執行緒將會呼叫 foo 方法,另乙個執行緒將會呼叫 bar 方法。請設計修改程式,以確保 foobar 被輸出 n 次。示例 1 輸入 n 1 輸出 foobar 解釋...

c 多執行緒交替列印 條件變數 鎖

主要知識 多執行緒,條件變數,鎖。這裡其實有乙個難點,當然可以在看了 之後再回頭來看,就是對std condition variable wait方法的理解。這裡解釋一下,當執行wait方法時,鎖是會被解開的以便別的執行緒使用資源,但是呼叫wait的執行緒會被阻塞直到別的執行緒呼叫notify等一系...

執行緒交替列印

建立三個執行緒,a執行緒列印10次a,b執行緒列印10次b,c執行緒列印10次c,要求執行緒同時執行,交替列印10次abc。這個問題用object的wait notify 就可以很方便的解決。主要的思想就是,為了控制執行的順序,必須要先持有prev鎖,也就前乙個執行緒要釋放自身物件鎖,再去申請自身物...