Linux_线程同步_信号量

信号量本质上是一种非负的整数计数器,用来控制对公共资源的访问。当信号量值大于0时则可以访问,否则将阻塞。

PV原语是对信号量的操作,P操作减一、V操作加一。

初始化:

#include <semaphore.h>

int sem_init(sem_t *sem, int pshared, unsigned int value);
pshared:为0,信号量在线程间共享,不为0在进程间共享
value:初始值
返回值:成功0失败-1

销毁:

int sem_destroy(sem_t *sem);
返回值:成功0失败-1

P操作:

int sem_wait(sem_t *sem);
返回值:成功0失败-1
int sem_trywait(sem_t *sem);  //非阻塞
int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);   //限时尝试获取

struct timespec{
    time_t tv_sec;
    long tv_nsec;
}

V操作:

int sem_post(sem_t *sem);
返回值:成功0失败-1

获取值:

int sem_getvalue(sem_t *sem, int *sval);
sval:保存信号量值的地址
返回值:成功0失败-1
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<pthread.h>
#include<semaphore.h>
 
sem_t sema;
sem_t semb;
sem_t semc;
 
void* funa(void* arg)
{
    for(int i=0;i<5;i++)
    {
        sem_wait(&sema);//ps1;
        printf("A");
        fflush(stdout);
        sem_post(&semb);//vs2
    }
}
 
void* funb(void* arg)
{
    for(int i=0;i<5;i++)
    {
        sem_wait(&semb);//psb;
        printf("B");
        fflush(stdout);
        sem_post(&semc);//vsc
    }
}
 
void * func(void *arg)
{
    for(int i=0;i<5;i++)
    {
        sem_wait(&semc);
        printf("C");
        fflush(stdout);
        sem_post(&sema);
    }
}
 
int main()
{
    sem_init(&sema,0,1);
    sem_init(&semb,0,0);
    sem_init(&semc,0,0);
 
    pthread_t id1,id2,id3;
    pthread_create(&id1,NULL,funa,NULL);
    pthread_create(&id2,NULL,funb,NULL);
    pthread_create(&id3,NULL,func,NULL);
 
    pthread_join(id1,NULL);
    pthread_join(id2,NULL);
    pthread_join(id3,NULL);
 
    sem_destroy(&sema);
    sem_destroy(&semb);
    sem_destroy(&semc);
 
    exit(0);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值