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

2021-05-10 13:55:01 字數 3254 閱讀 4826

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、函式實現。

view plaincopy to clipboardprint?

#include

#include

#include

#include

#include

#include

#define return_if_fail(p)  /  

if(!p)  

typedef struct _privinfo  

privinfo;  

static void info_init (privinfo* thiz);  

static void pthread_func_1 (privinfo* thiz);  

static void pthread_func_2 (privinfo* thiz);  

int main (int argc, char** argv)  

info_init (thiz);  

ret = pthread_create (&pt_1, null, (void*)pthread_func_1, null);  

if (net != 0)  

ret = pthread_create (&pt_1, null, (void*)pthread_func_2, null);  

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;  

}  #include

#include

#include

#include

#include

#include

#define return_if_fail(p)  /

if(!p)

typedef struct _privinfo

privinfo;

static void info_init (privinfo* thiz);

static void pthread_func_1 (privinfo* thiz);

static void pthread_func_2 (privinfo* thiz);

int main (int argc, char** argv)

info_init (thiz);

ret = pthread_create (&pt_1, null, (void*)pthread_func_1, null);

if (net != 0)

ret = pthread_create (&pt_1, null, (void*)pthread_func_2, null);

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~~

Linux 執行緒 四 (訊號量)

執行緒中的訊號量和程序中的訊號量的作用相同,都是用於同步操作,達到無衝突的訪問共享資源的目的。但是它們也是有一定的區別的。執行緒中的訊號量通過引數的不同,也可以在程序間使用。和semget 函式建立的訊號量不同,執行緒中的訊號量可以使兩個執行緒進行同步。我們先看一下執行緒中訊號量的api及其引數 i...

多執行緒 訊號量

訊號量 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...