Linux執行緒的訊號量同步

2021-08-14 07:18:16 字數 2063 閱讀 5485

訊號量和互斥鎖(mutex)的區別:互斥鎖只允許乙個執行緒進入臨界區,而訊號量允許多個執行緒同時進入臨界區。

不多做解釋,要使用訊號量同步,需要包含標頭檔案semaphore.h。

主要用到的函式:

下列的**演示了如何用訊號量同步,模擬乙個視窗服務系統。

/* @purpose: 基於訊號量的多執行緒同步,作業系統原理中的p,v操作

* @author: [email protected]

* @create: 2015-03-20 fri

* */

#include

#include

#include

#include

#include

/* @scene: 某行業營業廳同時只能服務兩個顧客。

* 有多個顧客到來,每個顧客如果發現服務視窗已滿,就等待,

* 如果有可用的服務視窗,就接受服務。 */

/* 將訊號量定義為全域性變數,方便多個執行緒共享 */

sem_t sem;

/* 每個執行緒要執行的例程 */

void * get_service

(void *thread_id)

}#define customer_num 10

intmain

(int argc, char *argv)

else

usleep(10);

}/* 等待所有顧客的執行緒結束 */

/* 注意:這地方不能再用i做迴圈變數,因為可能執行緒中正在訪問i的值 */

int j;

for(j = 0; j < customer_num; j++)

/* only a semaphore that has been initialized by sem_init(3)

* should be destroyed using sem_destroy().*/

sem_destroy(&sem);

return

0;}

編譯:gcc main.c -lpthread

執行結果(注意,每次執行都不相同):

customer 0 arrived.

customer 1 arrived.

customer 0

receive service ...

customer 2 arrived.

customer 1

receive service ...

customer 3 arrived.

customer 2

receive service ...

customer 4 arrived.

customer 3

receive service ...

customer 5 arrived.

customer 4

receive service ...

customer 6 arrived.

customer 5

receive service ...

customer 7 arrived.

customer 6

receive service ...

customer 8 arrived.

customer 7

receive service ...

customer 9 arrived.

customer 8

receive service ...

customer 9

receive service ...

分類: 

c/c++,

linux開發

標籤: 

linux, 

thread, 

semaphore

好文要頂

關注我收藏該文

jollywing

關注 - 6

粉絲 - 57

+加關注 0 0

插入排序及其複雜度分析

中標軟體筆試題回顧

Linux 執行緒同步 訊號量

linux 執行緒同步訊號量 訊號量用於多執行緒多工同步,乙個執行緒完成了某乙個動作後就通過訊號量告訴其他執行緒再進行某些動作,其他執行緒在等待某乙個執行緒時會阻塞。init sem t sem sem init sem,0,0 函式原型如下 int sem init sem t sem,intps...

執行緒訊號量同步

thread sem.c include include include include define thread number 3 define repeat number 3 define delay time levels 10.0 sem t sem thread number void ...

執行緒同步 訊號量

執行緒同步方法 訊號量不常用,找到個帖子不錯,記錄一下!依賴的標頭檔案 include 函式宣告 sem t 表示訊號量 int sem init sem t sem,int pshared,unsigned int value 名稱 sem init 功能 initialize an unname...