linux下交替打印AB代码实现——线程相关函数学习心得
代码 (LINUX)
题目:交替打印AB
利用线程中信号量的P(s)操作和V(s)操作特点完成这个程序,这次的代码实现是先在博客上参考,然后明白原理再次写的。
代码参考:https://blog.csdn.net/weixin_40547071/article/details/88726573
#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再进行减1
printf("%c\n",65);//65为A的ascii值
sem_post(&j_num); //给j_num加1
sleep(rand()%5);
}
}
void *Bb(void *arg)
{
while(1)
{
sem_wait(&j_num);
printf("%c\n",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
运行结果
《LINUX程序设计中文第四版》读书笔记
1.在线程中的信号量函数的定义如下:
线程中使用的基本信号量函数有4个:
#include<semaphore.h>
- int sem_init(sem_t *sem,int pshared,unsignded int value);
初始化由sem指向的信号量对象,设置他的共享选项,并给它一个初始的整数值。
pshared参数控制信号量的类型,如果pshared=0,就表示这个信号量是当前进程的局部信号量;如果pshared≠0,这个信号量就可以在多个进程之间共享。 - int sem_wait(sem_t * sem);
- int sem_post(sem_t * sem);
函数都以一个指针为参数,该指针指向的对象是由sem_init调用初始化的信号量。
sem_post作用是以原子操作的方式给信号量的值加1.
sem_wait作用是以原子操作的方式将信号量的值减1,但必须是非零值才会进行操作,否则就等待直到非零值的出现。
2.线程函数了解
3.线程了解
以下引用来自
原文: https://blog.csdn.net/evsqiezi/article/details/8061176
信号量的数据类型为结构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,属于无名信号量。
”