linux多執行緒學習 五 訊號量執行緒控制

2021-07-09 19:13:53 字數 2459 閱讀 8470



pv原語是對整數計數器訊號量sem的操作,一次p操作可使sem減一,而一次v操作可是sem加一。程序(或執行緒)根據訊號量的值來判斷是否對公共資源具有訪問許可權。當訊號量的值大於零或等於零的時候,該程序(或執行緒)具有對公共資源訪問的許可權,否則,當訊號量的值小於時,該程序(或執行緒)就會被阻塞,直到訊號量的值大於或等於一。

1、在linux中,實現了posix的無名訊號量,主要用於執行緒間的互斥同步,下面將簡單介紹一些函式介面:

(1)、sem_init

功能:         用於建立乙個訊號量,並初始化訊號量的值。

標頭檔案:      

函式原型:     int sem_init (sem_t* sem, int pshared, unsigned int value);

函式傳入值:   sem:訊號量。

pshared:決定訊號量能否在幾個程序間共享。由於目前linux還沒有實現進

程間共享資訊量,所以這個值只能取0。

函式返回值:   0:成功。

-1:失敗。

(2)其他函式。

int sem_wait       (sem_t* sem);

int sem_trywait   (sem_t* sem);

int sem_post       (sem_t* sem);

int sem_getvalue (sem_t* sem);

int sem_destroy   (sem_t* sem);

功能:sem_wait和sem_trywait相當於p操作,它們都能將訊號量的值減一,兩者的區別在

於若訊號量的值小於零時,sem_wait將會阻塞程序,而sem_trywait則會立即返回。

sem_post相當於v操作,它將訊號量的值加一,同時發出喚醒的訊號給等待的程序

(或執行緒)。

sem_getvalue 得到訊號量的值。

sem_destroy 摧毀訊號量。

函式傳入值: sem:訊號量。

函式返回值: 同上。

2、函式實現。

[c-sharp]view plain

copy

#include 

#include 

#include 

#include 

#include 

#include 

#define return_if_fail(p)  /

if((p) == 0)    

typedef struct

_privinfo    

privinfo;    

static

void

info_init (privinfo* thiz);    

static

void

* pthread_func_1 (privinfo* thiz);    

static

void

* pthread_func_2 (privinfo* thiz);    

intmain (

intargc, 

char

** argv)    

info_init (thiz);    

ret = pthread_create (&pt_1, null, (void

*)pthread_func_1, thiz);    

if(ret != 0)    

ret = pthread_create (&pt_2, null, (void

*)pthread_func_2, thiz);    

if(ret != 0)    

pthread_join (pt_1, null);    

pthread_join (pt_2, null);    

sem_destroy (&thiz->sem);    

free (thiz);    

thiz = null;    

return

;    

}    

static

void

info_init (privinfo* thiz)    

static

void

* pthread_func_1 (privinfo* thiz)    

sem_post (&thiz->sem);    

printf ("pthread1: pthread1 unlock/n"

);    

sleep (1);    

}    

return

;    

}    

static

void

* pthread_func_2 (privinfo* thiz)    

return

;    

}    

~~end~~

多執行緒 訊號量

訊號量 semaphore類 建立帶指定許可數的訊號量 semaphore semaphore new semaphore 1 建立乙個許可的訊號量 訊號量用來限制訪問共享數資源的執行緒數。在訪問資源之前,執行緒必須從訊號量獲取許可,在訪問完資源後釋放訊號量。任務通過呼叫訊號量的acquire 方法...

Linux多執行緒同步 訊號量

同步主線程與子執行緒 子執行緒之間的同步 使用單個訊號量 include include include include include include void ret result thread1 void ret result thread2 sem t sem void thread1fun...

Linux 多執行緒訊號量同步

p操作 v操作 include sem t sem 定義訊號量 sem init 初始化訊號量 sem wait 獲取訊號量,訊號量的數值 1 訪問共享資源 sem post 釋放乙個訊號量,及訊號量的數值 1 sem destroy 如果不再使用訊號量,則銷毀訊號量函式和posix ipc的訊號量...