LINUX下信号量的使用

首先通过man可以查看Linux下的信号量函数

// Linux信号量API函数
// int sem_init(sem_t *sem, int pshared, unsigned int value);
// int sem_destroy(sem_t *sem);
// int sem_post(sem_t *sem);
// int sem_wait(sem_t *sem);
// int sem_trywait(sem_t *sem); 
// int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout); 有一点需要注意的是abs_timeout是绝对时间不是相对时间

下面有一个测试程序,测试了各个函数在调用时的表现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <iostream>
#include <thread>
#include <unistd.h>
#include <pthread.h>
#include <signal.h>

#include <semaphore.h>

static sem_t  sem1;
void Test1()
{
    while(true)
    {
        sem_wait(&sem1);
        std::cout<<"sem_wait"<<std::endl;   
    }
}
void Test2()
{
    while(true)
    {
        int ret = sem_trywait(&sem1);
        //这里不会阻塞 
        //ret = 0       获取成功
        //ret = EAGAIN  未获取到
        if(!ret)
        {
            std::cout<<"sem_trywait"<<std::endl;
        }
        else if(errno == EAGAIN)
        {
            std::cout<<"errno = EAGAIN"<<std::endl;
            sleep(1);
        } 
        else{ sleep(1);}
    }
}
void Test3()
{
    while(true)
    {
        timespec mt = {0};
        mt.tv_sec = 1;
        int ret = sem_timedwait(&sem1,&mt);
        if(!ret)
        {
            std::cout<<"sem_timedwait"<<std::endl;
        }
        sleep(2);
    }
}
void Test4()
{
    while(true)
    {
        sem_wait(&sem1);
        std::cout<<"Test4"<<std::endl;
    }
}
void SemCreat()
{
    while(true)
    {
        sem_post(&sem1);
        sleep(10);
    }
}
int main(int argc, char *argv[])
{
    sem_init(&sem1,0,0);
    std::thread thread1(Test1);
    std::thread thread2(Test2);
    std::thread thread3(Test3);
    std::thread thread4(Test4);
    std::thread thread5(SemCreat);
    thread1.join();
    thread2.join();
    thread3.join();
    thread4.join();
    return 1;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值