linux多執行緒程式設計中使用訊號量同步與互斥鎖

2021-10-01 02:16:19 字數 3475 閱讀 2397

執行緒的訊號量與程序間通訊中使用的訊號量是一樣的,它是乙個特殊的變數。可以被增加和減少,但對其的關鍵操作訪問必須保證原子操作。如果乙個程式中有多個執行緒試圖改變乙個訊號量的值,系統將保證所有的操作都依次進行。

訊號量的函式都是以sem_開頭,執行緒中使用的基本訊號量函式有4個,在標頭檔案semaphore.h中。

該函式用於建立訊號量,其原型如下:

int sem_init(sem_t *sem, int pshared, unsigned int value);
(1) sem為要初始化的訊號量指標。

(3)value為訊號量的初始值。

該函式的原型如下:

int sem_post(sem_t *sem);
(1)該函式用於以原子操作的方式將訊號量加1,並且會丟擲訊號,原本被阻塞的sem_wait將被開啟。

(2)呼叫成功返回0,失敗返回-1,並且設定error

該函式的原型如下:

int sem_wait(sem_t *sem);
(1)該函式用於以原子操作的方式將訊號量加-1,等待sem_post丟擲訊號來,否則一直阻塞。

(2)呼叫成功返回0,失敗返回-1,並且設定error

該函式原型如下:

int sem_destroy(sem_t *sem);
(1)該函式對用完的訊號量清理

(2)呼叫成功返回0,失敗返回-1,並且設定error

用多執行緒實現輸入乙個非「end」的字串,並且算出字串的長度,輸入「end」時則結束程式,要求用主線程實現輸入並檢查字串是否為「end」,建立的新執行緒用來計算字串的長度。

#include #include #include #include #include char buf[100] = ;

sem_t sem;

int flag = 0;

void *func(void *ar**)

}pthread_exit(null);

}int main(void)

/*初始化執行緒間同步的訊號量*/

if(sem_init(&sem,0,0))

printf("請輸入乙個非\"end\"的字串\n");

while(scanf("%s",buf))

sem_post(&sem);//喚醒正在等待的所有執行緒

}/***子執行緒*/

if(pthread_join(th,null))

else

/***sem訊號量*/

sem_destroy(&sem);

return 0;

}

root@ubuntu:/home/yong/c_c++/2019/9.9# 

root@ubuntu:/home/yong/c_c++/2019/9.9# ./a.out

請輸入乙個非"end"的字串

dwed

輸入的字串長度為4

請輸入乙個非"end"的字串

fef輸入的字串長度為3

請輸入乙個非"end"的字串

efewf

輸入的字串長度為5

請輸入乙個非"end"的字串

fwew

輸入的字串長度為4

請輸入乙個非"end"的字串

end子執行緒**成功

root@ubuntu:/home/yong/c_c++/2019/9.9#

互斥鎖簡單的可以認為是一種特殊的訊號量,它的值只能是0和1,也就是上鎖和解鎖兩種狀態。

它們都在標頭檔案pthread.h中,檔案要加上#include

該函式的原型是:

int pthread_mutex_init(pthread_mutex_t *restrict mutex,

const pthread_mutexattr_t *restrict attr);

(1)mutex指向要初始化的互斥鎖物件

(2)attr位互斥屬性,用null表示該屬性預設

(3)成功則返回0;失敗則設定error

該函式原型是:

int pthread_mutex_lock(ptread_mutex_t *mutex);
(1)mutex是互斥物件指標

(2)成功返回0,失敗則設定error

(3)設定上鎖,對於另外乙個pthread_mutex_lock()函式則表示阻塞

(1)mutex是互斥物件指標

(2)成功返回0,失敗則設定error

(3)設定解鎖,解開pthread_mutex_lock()的鎖

(1)mutex是互斥物件指標

(2)成功返回0,失敗則設定error

(3)銷毀乙個互斥鎖

#include #include #include #include #include char buf[100] = ;

int flag = 0;

pthread_mutex_t mutex;

void *func(void *ar**)

pthread_mutex_unlock(&mutex);

sleep(1);

}}int main(void)

/*初始化執行緒間互斥鎖*/

if(pthread_mutex_init(&mutex,null))

printf("請輸入乙個非\"end\"的字串\n");

while(1)

pthread_mutex_unlock(&mutex);//解鎖

sleep(1);//讓子執行緒先執行

}/***子執行緒*/

if(pthread_join(th,null))

else

/*銷毀互斥鎖*/

if(pthread_mutex_destroy(&mutex))

return 0;

}

執行結果

root@ubuntu:/home/yong/c_c++/2019/9.9# ./a.out 

請輸入乙個非"end"的字串

wdew

輸入的字串長度為4

請輸入乙個非"end"的字串

refregerg

輸入的字串長度為9

請輸入乙個非"end"的字串

regerg

輸入的字串長度為6

請輸入乙個非"end"的字串

reger

輸入的字串長度為5

請輸入乙個非"end"的字串

ergerg

輸入的字串長度為6

請輸入乙個非"end"的字串

end子執行緒**成功

root@ubuntu:/home/yong/c_c++/2019/9.9#

linux 多執行緒程式設計 訊號量的使用

訊號是e.w.dijkstra在二十世紀六十年代末設計的一種程式設計架構。dijkstra的模型與鐵路操作有關 假設某段鐵路是單線的,因此一次只允許一列火車通過。訊號將用於同步通過該軌道的火車。火車在進入單一軌道之前必須等待訊號燈變為允許通行的狀態。火車進入軌道後,會改變訊號狀態,防止其他火車進入該...

linux 多執行緒程式設計的訊號問題

最近,複習unix高階環境程式設計,當涉及到多執行緒程式設計的時候,對多執行緒環境下的訊號的處理目前存在很多疑惑。其中之一,多執行緒環境下的訊號處理必須使用多執行緒環境下pthread提供的介面,對訊號進行遮蔽以及等待。若要在多執行緒下對訊號進行阻塞的話,必須使用pthread sigmask 對訊...

Linux多執行緒程式設計 訊號量

1.1訊號量簡介 linux下主要分為兩種訊號量,system v和posix訊號量,posix訊號量又分為無名訊號量和有名訊號量,這裡我們只分享無名訊號量這裡我們主要研究posix訊號量。訊號量是同步的一種方式,常常用於對共享資源的訪問,舉乙個常見的例子,假如乙個停車場有100個停車位,我們將車停...