题目:交替打印AB
利用线程中信号量的P(s)操作和V(s)操作特点完成这个程序,这次的代码实现是先在博客上参考,然后明白原理再次写的。
代码参考:
#include<semaphore.h>
#include<stdlib.h>
#include<pthread.h>
#include<stdio.h>sem_t i_num,j_num;//信号量数据类型sem_t
void *Aa(void *arg)
{while(1){sem_wait(&i_num);//i_num减1,如果i_num为0,在这里阻塞,直到不为0再进行减1printf("%cn",65);//65为A的ascii值sem_post(&j_num); //给j_num加1sleep(rand()%5);}
}
void *Bb(void *arg)
{while(1){sem_wait(&j_num);printf("%cn",66);sem_post(&i_num);sleep(rand()%5);}
}
int main(int argc,char*argv[])
{pthread_t pid,cid;//线程数据类型sem_init(&i_num,0,1);//对信号量进行初始化sem_init(&j_num,0,0);pthread_create(&pid,NULL,Aa,NULL);pthread_create(&cid,NULL,Bb,NULL);pthread_join(pid,NULL);//回收线程,pthread_join(cid,NULL);sem_destroy(&i_num);sem_destroy(&j_num);//销毁信号量
}42,1 Bot
线程中使用的基本信号量函数有4个:
#include<semaphore.h>
以下引用来自
原文:
信号量的数据类型为结构sem_t,它本质上是一个长整型的数。
函数sem_post( sem_t *sem )用来增加信号量的值。当有线程阻塞在这个信号量上时,调用这个函数会使其中的一个线程不在阻塞,选择机制同样是由线程的调度策略决定的。int sem_post(sem_t *sem);sem_post() 成功时返回 0;错误时,信号量的值没有更改,-1 被返回,并设置errno 来指明错误。错误 EINVAL sem 不是一个有效的信号量。EOVERFLOW 信号量允许的最大值将要被超过。
函数sem_wait( sem_t *sem )被用来阻塞当前线程直到信号量sem的值大于0,解除阻塞后将sem的值减一,表明公共资源经使用后减少。
函数sem_destroy(sem_t *sem)用来释放信号量sem,属于无名信号量。
”
本文发布于:2024-02-01 14:04:15,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170676745737122.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |