今天有空就研究了下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 每個物件都對應於乙個 互斥鎖 的標記,這個標記用來保證在任一時刻,只能...