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