代码
#include<myhead.h>
sem_t sem1;
sem_t sem2;
sem_t sem3;
int c=10000;
void *task1(void *arg)
{
int num=5;
while (num--)
{
sleep(1);
sem_wait(&sem3);
c-=3000;
printf("此时线程1,临界资源减少3000为c=%d\n",c);
sem_post(&sem1);
}
pthread_exit(NULL);
}
void *task2(void *arg)
{
int num=5;
while (num--)
{
sleep(1);
sem_wait(&sem1);
c+=3000;
printf("此时线程2,临界资源加3000为c=%d\n",c);
sem_post(&sem2);
}
pthread_exit(NULL);
}
void *task3(void *arg)
{
int num=5;
while (num--)
{
sleep(1);
sem_wait(&sem2);
c*=3;
printf("此时线程3,临界资源扩大三倍为c=%d\n",c);
sem_post(&sem3);
}
pthread_exit(NULL);
}
int main(int argc, char const *argv[])
{
pthread_t tid1,tid2,tid3;
//无名信号量初始化
//sem_init的第三个参数可以影响无名信号量申请和释放的顺序
//越大越先,越小越后
sem_init(&sem1,0,0);
sem_init(&sem2,0,0);
sem_init(&sem3,0,1);
printf("c的值本来是%d\n",c);
//线程创建
pthread_create(&tid1,NULL,task1,NULL);
pthread_create(&tid2,NULL,task2,NULL);
pthread_create(&tid3,NULL,task3,NULL);
//线程回收
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
pthread_join(tid3,NULL);
//无名信号量销毁
sem_destroy(&sem1);
sem_destroy(&sem2);
sem_destroy(&sem3);
return 0;
}
运行结果