給執行緒一個順序(及執行緒的同步)
阿新 • • 發佈:2021-07-20
訊號量(執行緒同步)
標頭檔案
#include <semaphore.h>
訊號量的初始化:
int sem_init(sem_t *sem, int pshared, unsigned int value);
return: 0成功 -1失敗
sem_t *sem: 要初始化的訊號量
int pshared: 0表示執行緒間 1表示程序
unsigned int value: 初始化訊號的資源數
p操作:
sem_wait
申請資源,如果沒有資源,則程式阻塞休眠,如果有資源,資源數-1 ,程式繼續執行
v操作:
sem_post
V操作:釋放資源,對應資源+1
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <pthread.h> #include <unistd.h> #include <semaphore.h> /* 按順序輸出我是1我是2不會亂序。 */ sem_t rt, dt;//定義兩個訊號量 void *fun_1(void *arg)//執行緒1 { char *p = (char *)arg; while(1) { //申請資源,如果沒有資源,則程式阻塞休眠,如果有資源,資源數-1,程式繼續執行sem_wait(&rt); puts(p); sleep(1); //釋放資源,對應資源+1 sem_post(&dt); } } void *fun_2(void *arg)//執行緒2 { char *p = (char *)arg; while(1){ //申請資源,如果沒有資源,則程式阻塞休眠,如果有資源,資源數-1,程式繼續執行 sem_wait(&dt); puts(p); sleep(1); //釋放資源,對應資源+1 sem_post(&rt); } } int main()//main函式內為主執行緒,主執行緒在執行子執行緒才能正常執行。 { pthread_t tid_1; pthread_t tid_2; if(0 != pthread_create(&tid_1, NULL, fun_1, "I am one!")){ perror("pthread_create1"); return -1; } if(0 != pthread_create(&tid_2, NULL, fun_2, "I am two!")){ perror("pthread_create1"); return -1; } //初始化訊號量 if(0 != sem_init(&rt, 0, 1))//給rt分配1個資源 { perror("sem_init"); return -1; } if(0 != sem_init(&dt, 0, 0))//給dt分配0個資源 { perror("sem_init"); return -1; } while(1) { sleep(3); } }
注意:多執行緒程式在編譯的時候需要連結對應的庫-lpthread