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>

  1. int sem_init(sem_t *sem,int pshared,unsignded int value);
    初始化由sem指向的信号量对象,设置他的共享选项,并给它一个初始的整数值。
    pshared参数控制信号量的类型,如果pshared=0,就表示这个信号量是当前进程的局部信号量;如果pshared≠0,这个信号量就可以在多个进程之间共享。
  2. int sem_wait(sem_t * sem);
  3. 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,属于无名信号量。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值