#include<semaphore.h>
sem_t abc //申请一个叫abc的semaphore变量
int sem_init (sem_t *sem, int pshared, unsigned int value); // 初始化;第一个参数即为要初始化的sem_t变量,第二个参数为0即表示为当前进程的局部信号量,不应用于其 他进程,第三个即为信号量初值设置
首先需要用sem_init(); 初始化sem_t型变量,并设置初始信号量。比如设置为1即变为互斥锁;
调用sem_wait(sem_t *); 信号量减一,即P操作
调用sem_post(sem_t *); 信号量加一,即V操作
当信号量为0时,调用sem_wait(); 函数阻塞,等待信号量 >0 时,才进行。
#include<semaphore.h>
#include<stdio.h>
#include<pthread.h>
using namespace std;
sem_t abc1; //设置为10
sem_t abc2; //设置为0
sem_t mutex; //互斥变量,设为1
int num=0;
void* tprocess1(void* args)
{
while(1){
sem_wait(&abc1);
sem_wait(&mutex);
num++;
printf("跑出%d只兔兔\n",num);
sem_post(&mutex);
sem_post(&abc2);
}
return NULL;
}
void* tprocess2(void* args)
{
while(1){
sem_wait(&abc2);
sem_wait(&mutex);
printf("亲一下,一只兔兔满足的走了\n");
num--;
printf("还剩%d只兔兔\n",num);
sem_post(&mutex);
sem_post(&abc1);
}
return NULL;
}
int main()
{
pthread_t t1;
pthread_t t2;
sem_init(&abc1,0,10);
sem_init(&abc2,0,0);
sem_init(&mutex,0,1);
pthread_create(&t1,NULL,tprocess1,NULL);
pthread_create(&t2,NULL,tprocess2,NULL);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
return 0;
}