線程中的信號量和進程中的信號量的作用相同,都是用於同步操作,達到無衝突的訪問共享資源的目的。但是它們也是有一定的區別的。
線程中的信號量通過參數的不同,也可以在進程間使用。
和semget() 函數創建的信號量不同,線程中的信號量可以使兩個線程進行同步。
我們先看一下線程中信號量的API及其參數:
#include <semaphore.h>
1.定義信號量 sem_t sem
2.初始化信號量 sem_init(sem_t *sem,
int shared, //0表示進程內多線程使用
int val)//信號量初值
3.PV: int sem_wait(sem_t *sem) //sem--;如果小於0,阻塞
int sem_post(sem_t *sem) //sem++
4.銷燬:int sem_destroy(sem_t *sem);
例子:通過兩個線程分別打印12,線程1打印1,線程2打印2
代碼如下:
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<unistd.h>
#include<string.h>
#include<semaphore.h>
pthread_mutex_t mutex;
sem_t sem_full;
sem_t sem_empty;
void *rout1(void *arg)
{
while(1)
{
//sem_full不爲0 不阻塞,sem_full--
sem_wait(&sem_full);
pthread_mutex_lock(&mutex);
printf("1");
fflush(stdout);
sleep(1);
pthread_mutex_unlock(&mutex);
//empty++
sem_post(&sem_empty);
}
return NULL;
}
void *rout2(void *arg)
{
while(1)
{
//如果屏幕爲佔用,即sem_empty爲0 阻塞
sem_wait(&sem_empty);
pthread_mutex_lock(&mutex);
printf("2");
fflush(stdout);
sleep(1);
pthread_mutex_unlock(&mutex);
//sem_full++
sem_post(&sem_full);
}
}
int main()
{
pthread_t tid1,tid2;
//初始化sem_full爲1,共享變量屏幕1
sem_init(&sem_full,0,1);
sem_init(&sem_empty,0,0);
pthread_mutex_init(&mutex,NULL);
pthread_create(&tid1,NULL,rout1,NULL);
pthread_create(&tid2,NULL,rout2,NULL);
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
pthread_mutex_destroy(&mutex);
return 0;
}
運行結果:
信號量爲1,即一個屏幕。通過信號量,同步完成打印12數字。
POSIX信號量和 SystemV信號量,不同的就是:POSIX信號量可以進行同步操作。相比較一下,POSIX信號量更容易使用。