首先通过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;
}