程式設計實現三個執行緒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...