實驗2 執行緒同步與通訊

2022-09-15 09:48:11 字數 1960 閱讀 7127

執行緒同步

設計並實現乙個計算執行緒與乙個i/o執行緒共享緩衝區的同步與通訊, 程式要求:

兩個執行緒,共享公共變數a;

執行緒1負責計算(1到100的累加,每次加乙個數);

執行緒2負責列印(輸出累加的中間結果);

主程序等待子執行緒退出。

(1)採用讀寫鎖來實現

pthread_rwlock_t rwlock;
---建立一把讀寫鎖

---建立乙個寫的執行緒

pthread_create(&ptid[0],null,writenum,null); //

寫函式

for(i = 1; i<= 100; i++)
---建立讀執行緒 以及執行緒函式執行內容

pthread_create(&ptid[1],null,readnum,null); //

讀函式

while(1

)

---**讀寫執行緒

pthread_join(ptid[0

], null);

pthread_join(ptid[

1], null);

---結果:

(2)採用訊號燈實現

---建立訊號燈

1 semid = semget((key_t)ipc_private,2,ipc_creat|0666); //

2if(semid == -1

)

--給訊號燈賦值:上面我們建立了兩個訊號燈

1

union semun un1, un2;

2 un1.val = 0;3

if((semctl(semid,0,setval,un1)) == -1

) 6 un2.val = 1;7

if((semctl(semid,1,setval,un2)) == -1

)

---建立兩個程序:乙個執行加i並寫num操作,乙個執行讀num操作

1 pthread_create(&ptid[0],null,(void *)writenum,null); //

寫函式2

3for(i = 1; i<= 100; i++)

1 pthread_create(&ptid[1],null,(void *)readnum,null); //

讀函式2

3while(1

)

---p、v操作函式

1

struct

sembuf sem;

2 sem.sem_num = index; //

訊號量編號

3 sem.sem_op = -1; //

p操作-1

4 sem.sem_*** = 0; //

操作標記:0或ipc_nowait等

5if(semop(semid,&sem,1) == -1

)

1

struct

sembuf sem;

2 sem.sem_num =index;

3 sem.sem_op = 1

;4 sem.sem_*** = 0;5

if(semop(semid,&sem,1) == -1

)

---執行結果:

執行緒同步通訊

package itcast.thread public class traditionalthreadcommunication start for int i 1 i 50 i public class business catch interruptedexception e for int ...

執行緒同步通訊

看傳智播客張孝祥講的乙個例子。子執行緒迴圈10次,接著主線程迴圈100次,再次回到子執行緒迴圈10次,接著再回到主線程迴圈100次,如此迴圈50次,請寫出程式。package cn.itcast.heima2 public class traditionalthreadcommunication s...

初探 程序通訊與執行緒同步

不推薦使用signal 介面,推薦使用sigacton 相關介面 訊號集處理函式 int sigemptyset sigset t set int sigfillset sigset t set int sigdelset sigset t set,int signo int sigmember s...