使用多執行緒交替列印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鎖,也就前乙個執行緒要釋放自身物件鎖,再去申請自身物...