使用信号量实现线程间的同步

 初始化信号量

int sem_init(sem_t *sem, int pshared, unsigned int value);
sem信号量指针
pshared

pshared的值为0,则表示线程间通信

非0表示进程间通信

value信号量初值

 申请资源(P操作)和释放资源(V操作)

P操作:当信号量的值大于0时,P操作一次,申请到资源,信号量减1,当信号量的值为0时,P操作堵塞等待资源;

V操作:不会堵塞,如果任务等待资源,V操作一次唤醒第一个任务让其继续运行,如果没有任务等待资源,V操作一次信号量加1;

int sem_wait(sem_t *sem);//p操作
int sem_post(sem_t *sem);//v操作

从键盘上输入,实现读写同步

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <semaphore.h>
#include <string.h>

#define SIZE 128
char buf[SIZE];
sem_t semr;//信号量,可读资源数
sem_t semw;//可写资源数

void *pthread_fun(void *arg)
{
        while(1)
        {
                sem_wait(&semr);//P操作
                printf("You enter %ld character\n",strlen(buf));
                sem_post(&semw);//V 操作
        }
     
}
int main(int argc,char *argv[])
{
        pthread_t tid;
        int arg = 123;
        if(sem_init(&semr,0,0) == -1)//初始化信号量
        {
                perror("sem_init");
                return -1;
        }
        if(sem_init(&semw,0,1) == -1)//初始化信号量
        {
                perror("sem_init");
                return -1;
        }
        int ret = pthread_create(&tid,NULL,pthread_fun,&arg);//创建子线程
        if(0 != ret)
        {
                perror("pthread_create");
                 return -1;
        }

        do{
                sem_wait(&semw);
                fgets(buf,sizeof(buf),stdin);//从键盘输入数据读到buf中
                sem_post(&semr);
        }while(strncmp(buf,"quit",4));//输入quit退出    
       
        return 0;

 编译结果

w@ubuntu:~/day4$ gcc sem_init.c -lpthread
ww@ubuntu:~/day4$ ./a.out
hello
You enter 6 character
quit

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值