linux 執行緒互斥同步By訊號量

2021-07-10 15:21:14 字數 1728 閱讀 8897

今天有空就研究了下linux執行緒間的同步通訊by訊號量,離校錢只是匆匆的從網上看了一點概念性的東西(其實連概念也談不上,就知道有訊號量這麼回事),對於具體的怎麼用**實現也不知道,現在正好有時間,研究了一下。

sem_t
#include 

int sem_init(sem_t *sem, int pshared, unsigned value);

int sem_destroy(sem_t *sem);

返回: 成功返回0,出錯返回錯誤編號

引數:sem:

訊號量指標

pshared:

是否在程序間共享的標誌,0為不共享,1為共享。

value

訊號量的初始值

#include int sem_post(sem_t *sem);

功能: 增加訊號量的值

int sem_wait(sem_t *sem);

功能: 減少訊號量的值

int sem_trywait(sem_t *sem);

功能: sem_wait()的非阻塞版本

返回: 成功返回0,出錯返回錯誤編號

呼叫sem_post(): 一次訊號量作加1操作

呼叫sem_wait():一次訊號量作減1操作

當執行緒呼叫sem_wait()後,若訊號量的值小於0則執行緒

阻塞。只有其它執行緒在呼叫sem_post()對訊號量作加

操作後並且其值大於或等於0時,阻塞的執行緒才能繼續執行。

#include 

#include

#include

#include

#if 0

int sem_init(sem_t *sem, int pshared, unsigned int value);

int sem_destroy(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);

int sem_post(sem_t *sem);

#endif

sem_t sem[3];

char ch = 'a';

void *th1(void *arg)

return (void*)0;}

void *th2(void *arg)

return (void*)0;}

void *th3(void *arg)

return (void*)0;}

int main(void)

for(i = 0;i < 3;i++)

return

0;}

tsong@tslinux:~/summery/thread$ ./sem

@(1501783808),a

b tangsong success!

@(1501783808),b

c tangsong success!

@(1501783808),c

d tangsong success!

@(1501783808),d

e tangsong success!

執行結果如上

Linux執行緒 執行緒同步互斥 訊號量

從概念上來說,訊號量是乙個非負整數計數。訊號量通常用來協調對資源的訪問,其 中訊號計數會初始化為可用資源的數目。然後,執行緒在資源增加時會增加計數,在刪 除資源時會減小計數,這些操作都以原子方式執行。如果訊號計數變為零,則表明已無可用資源。計數為零時,嘗試減小訊號的執行緒會被 阻塞,直到計數大於零為...

執行緒同步與互斥 訊號量

關於訊號量,我們在前面程序間通訊也談到過,今天我們再來看看使用訊號量實現執行緒間的同步與互斥問題。再來說說什麼是訊號量?號量的操作函式。sem init 用來初始化乙個訊號量,sem t sem是自己定義的sem變數的位址,pshared引數為0,用於表示訊號量用於同一程序間的執行緒間同步,valu...

Linux 執行緒同步 互斥量(互斥鎖)

1 執行緒同步的目的是不管執行緒之間的執行如何穿插,其執行結果都是正確的。即保證多執行緒執行下結果的確定性。2 同步就是讓所有執行緒按照一定的規則執行,使得其正確性和效率都有跡可循,即執行緒同步就是對執行緒之間的穿插進行控制。3 每個物件都對應於乙個 互斥鎖 的標記,這個標記用來保證在任一時刻,只能...