Linux執行緒同步之訊號量

2021-10-05 07:04:19 字數 2620 閱讀 3112

​ 訊號量可以同時訪問多份資源。

#include

intsem_init

(sem_t* sem,

int pshared,

unsigned

int value)

;int

sem_destroy

(sem_t* sem)

;int

sem_post

(sem_t* sem)

;int

sem_wait

(sem_t* sem)

;int

sem_trywait

(sem_t* sem)

;int

sem_timedwait

(sem_t* sem,

const

struct timespec* abs_timeout)

;

​ sem是建立訊號量物件位址 , pshared代表是否可以與fork出的子程序共享資源(0代表不可共享 , 1代表可共享),value代表初始狀態下的資源數。

​ 銷毀訊號量。

​ 訊號量的資源計數遞增1。當時用sem_wait函式的話就會被喚醒。

​ 不斷去嘗試喚醒,如果失敗,就會發回eagain錯誤碼。

​ sem_timedwait 在引數 abs_timeout設定的時間內等待訊號量物件的資源計數大於0,否則超時返回,返回值為 ﹣1,錯誤碼 etimedout。當使用 sem_timedwait 時,引數 abs_timeout 不能設定為 null,否則程式會在執行時呼叫 sem_timedwait 產生崩潰。

struct timespec

;

#include

#include

#include

#include

pthread_mutex_t mymutex;

sem_t mysemaphore;

int global =0;

int global_c =0;

void

*consumer_thread

(void

*para)

return

null;}

void

*producer_pthread

(void

*para)

return

null;}

intmain

(int argc,

const

char

*ar**)

pthread_t producer_pthreadid;

pthread_create

(&producer_pthreadid ,

null

, producer_pthread ,

null);

pthread_join

(producer_pthreadid ,

null);

for(i =

0; i <

5; i++

)sem_destroy

(&mysemaphore)

;pthread_mutex_destroy

(&mymutex)

;return0;

}

linux@linux:/mnt/hgfs/ubuntushare/pthread$ ./a.out 

*****producer_pthread*****

producer_pthread :global = 1

-------- consumer_threadid-1076573684-------

consumer__pthread :global_c = 1

-------- consumer_threadid-1076573688-------

consumer__pthread :global_c = 2

-------- consumer_threadid-1076573692-------

consumer__pthread :global_c = 3

-------- consumer_threadid-1076573696-------

consumer__pthread :global_c = 4

-------- consumer_threadid-1076573700-------

consumer__pthread :global_c = 5

sleep(5)

producer_pthread :global = 2

sleep(1)

consumer__pthread :global_c = 6

sleep(1)

consumer__pthread :global_c = 7

sleep(1)

consumer__pthread :global_c = 8

sleep(1)

consumer__pthread :global_c = 9

sleep(1)

consumer__pthread :global_c = 10

^c

Linux 執行緒同步之訊號量同步

linux中兩種基本的同步方法是訊號量和互斥量。這兩種方法很相似,而且它們可以相互通過對方來實現。下面介紹用訊號量進行同步。訊號量概念由荷蘭科學家dijkstra首先提出。訊號量是乙個特殊型別的變數,它可以被增加或者減少。但對其的關鍵訪問被保證是原子操作,即使在乙個多執行緒程式中也是如此。訊號量有兩...

Linux 執行緒同步之訊號量同步

linux中兩種基本的同步方法是訊號量和互斥量。這兩種方法很相似,而且它們可以相互通過對方來實現。下面介紹用訊號量進行同步。訊號量概念由荷蘭科學家dijkstra首先提出。訊號量是乙個特殊型別的變數,它可以被增加或者減少。但對其的關鍵訪問被保證是原子操作,即使在乙個多執行緒程式中也是如此。訊號量有兩...

執行緒同步之訊號量同步

linux中兩種基本的同步方法是訊號量和互斥量。這兩種方法很相似,而且它們可以相互通過對方來實現。現在有個圖書館,其能容納100人,現在有兩個執行緒a b,a執行緒執行 往圖書管理進入乙個人,b執行緒 從圖書館出來乙個人。那麼為了使得執行緒a在圖書館滿人的時候進入等待,而不是繼續往圖書館裡進人,使得...