C 執行緒交叉列印1 100

2021-10-04 08:15:26 字數 2096 閱讀 2017

哈哈哈,睡醒了突然覺得昨晚的太簡單了,又想起了一道題,交叉列印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.在每一輪當中,這個印表機可以列印從任意位置開始到任意位置結束的新字母,並且可以覆蓋掉原來存在的字母。給定乙個僅包含小寫英文本母的字串,你的任務是計算印表機為了列印出它鎖需要的最小...