哈哈哈,睡醒了突然覺得昨晚的太簡單了,又想起了一道題,交叉列印1-100,雖然難度也還是只提公升了一丟丟。但是,複習一下也算嘛。
#include
#include
#include
#include
using
namespace std;
mutex data_mutex;
condition_variable flag_cond;
bool flag =
true
;void
printji()
);cout <<
"a "
<< i << endl;
i +=2
; flag =
false
; flag_cond.
notify_one()
;}}void
printou()
);cout <<
"b "
<< i << endl;
i +=2
; flag =
true
; flag_cond.
notify_one()
;}}int
main()
這裡雖然簡單,但還是說一句,開始的時候我把i是i+1,犯了低階錯誤,兩個函式中的i其實不是乙個i,驗證一下,把第二個裡面換成j,其實並沒有變化,所以兩個執行緒交叉列印自己擁有的乙個數,互動的只有flag。
我想讓他們改的是同乙個數,交叉修改此數。
我們先測試一下非同步的吧,不加鎖修改乙個變數看會發生什麼?
#include
#include
#include
#include
using
namespace std;
mutex data_mutex;
condition_variable flag_cond;
bool flag =
true
;int i =1;
void
printji()
/*while (i <= 100)
); cout << "a " << i << endl;
i += 2;
flag = false;
flag_cond.notify_one();
}*/}void
printou()
/*int j = 2;
while (j <= 100)
); cout << "b " << j << endl;
j += 2;
flag = true;
flag_cond.notify_one();
}*/}int
main()
從圖中可以看出,執行緒搶占式修改,每次執行都不一樣。
所以我們還是同步一下,加條件變數修改同乙個數。
#include
#include
#include
#include
using
namespace std;
mutex data_mutex;
condition_variable flag_cond;
bool flag =
true
;int i =1;
void
printji()
);cout <<
"a "
<< i << endl;
i +=1
;//此處變為+1
flag =
false
; flag_cond.
notify_one()
;}}void
printou()
);cout <<
"b "
<< i << endl;
i +=1
; flag =
true
; flag_cond.
notify_one()
;}}int
main()
Linux下多執行緒交叉列印1 100的奇偶數
第一次寫部落格有億點點緊張 1 要求 1.有三個執行緒,1.1執行緒1負責把1 99之間的奇數,放入緩衝區 1.2執行緒2負責把2 100之間的偶數,放入緩衝區 1.3執行緒3負責把緩衝區的資料讀出並列印在終端 2.三個執行緒之間互斥使用緩衝區 3.執行緒1和執行緒2交替放入資料,即按照1,2 3 ...
Java兩個執行緒輪換列印1 100內的奇數和偶數
問題 兩個執行緒,乙個列印1 100的奇數,乙個列印1 100的偶數 要求 執行緒1列印5個之後,執行緒2開始列印,執行緒2列印5個之後,執行緒1再開始列印,以此迴圈。public class test catch interruptedexception e 當state 1時,輪到執行緒1列印5...
lintCode1100 奇怪的印表機
1100 奇怪的印表機 有乙個奇怪的印表機,它有如下兩個特別的要求 1.這個印表機只每次能列印乙個由相同字母構成的串。2.在每一輪當中,這個印表機可以列印從任意位置開始到任意位置結束的新字母,並且可以覆蓋掉原來存在的字母。給定乙個僅包含小寫英文本母的字串,你的任務是計算印表機為了列印出它鎖需要的最小...