三個執行緒,依次列印

2021-08-04 21:59:32 字數 1685 閱讀 8819

程式設計實現三個執行緒abc,並讓它們順次列印abc

思路:設定三個訊號量:s1, s2, s3,s2由s1 post,s3由s2 post, s1由s3 post,由a執行緒先開始列印,其他執行緒必然在等待訊號量,所以三個執行緒一定會按照訊號量的順序來列印。

注意vs 2015中多執行緒使用要呼叫windows下的api。一般在linux下用作業系統中講到的posix那一套。

**實現:

/*

* 3個執行緒逐個執行列印,執行緒依次控制下乙個執行緒的訊號量

*/#include

#include

#include

#include

sem_t sem_id1, sem_id2, sem_id3;

void

* func1(void

*);void

* func2(void

*);void

* func3(void

*);int main()

void

* func1(void

*)void

* func2(void

*)void

* func3(void

*)// compile and run

// 編譯選項要加-pthread,否則報錯說找不到執行緒函式

g++-pthread thread_print_in_order.cpp -o test

./test

sem_wait sem_post

訊號量的資料型別為結構sem_t,它本質上是乙個長整型的數。函式sem_init()用來初始化乙個訊號量。

它的原型為:extern int sem_init __p ((sem_t *__sem, int __pshared, unsigned int __value));  

sem為指向訊號量結構的乙個指標;pshared不為0時此訊號量在程序間共享,為0時只能為當前程序的所有執行緒共享;value給出了訊號量的初始值。  

函式sem_post( sem_t *sem)用來增加訊號量的值。當有執行緒阻塞在這個訊號量上時,呼叫這個函式會使其中的乙個執行緒不在阻塞,選擇機制同樣是由執行緒的排程策略決定的。  

函式sem_wait( sem_t *sem)被用來阻塞當前執行緒直到訊號量sem的值大於0,解除阻塞後將sem的值減一,表明公共資源經使用後減少。函式sem_trywait (sem_t *sem )是函式sem_wait()的非阻塞版本,它直接將訊號量sem的值減一。函式sem_destroy(sem_t *sem)用來釋放訊號量sem。

若是不使用訊號量,則還可以建立乙個執行緒,在該執行緒中繼續建立乙個執行緒,遞迴的呼叫下去,等待每個執行緒返回,不斷列印出順序值。

**如下:

#include 

#include

#include

void * func1(void *);

void * func2(void *);

void * func3(void *);

int main()

void * func1(void *)

void * func2(void *)

void * func3(void *)

從三個執行緒 排隊列印 , 到 多個執行緒列印

第一中 大暴力 直接 while 迴圈 判斷mark private static class two implements runnable override public void run static void start for int i 0 i n i 第二種 利用 reentrantl...

三個執行緒ABC,交替列印ABC

問題為三線程間的同步喚醒操作,主要的目的就是threada threadb threadc threada 迴圈執行三個執行緒。為了控制線程執行的順序,那麼就必須要確定喚醒 等待的順序,所以每乙個執行緒必須同時持有兩個物件鎖,才能繼續執行。乙個物件鎖是prev,就是前乙個執行緒所持有的物件鎖。還有乙...

建立三個執行緒,分別列印 a,b,c

建立三個執行緒,分別列印 a,b,c.現在要求用訊號量對執行緒進行同步,無論程式執行 多少次 如何執行,都能使整個程式依次列印 a b c a b c a b c 一直死迴圈 include include include include include include include includ...