sem信号量线程间通信

信号量主要用于进程或者线程间通信,是指当前某一资源的数量
1)初始化:int sem_init(sem_t * sem, int pshared, unsigned int val);//其中sem为申请的信号量,pshared值(1:进程间;0:线程间),val为信号量初值 返回值:0,-1
2)申请资源(P操作):int sem_wait(sem_t * sem); 返回值:0,,1
3)释放资源(V操作):int sem_post(sem_t * sem); 返回值:0,-1
4)创建线程:int pthread_create((pthread_t thread, pthread_attr_t attr, void (start_routine)(void ), void arg); //其中thread:线程标识符; attr:线程属性设置;start_routine:线程函数的起始地址,即线程创建成功后执行的函数;arg:传递给start_routine的参数;
实例一:两线程同步读写缓冲区(生产者,消费者问题):(其中同步是指按进程照制定顺序互不影响的运行)

/*

  • 题目:信号量-线程间的通信(生产者/消费者问题)
  • 作者:翟晓树
  • 时间:2020.6.19
  • 编写思路:主程序中再创建一个线程,主程序占用信号量往缓冲区写数据后释放信号量,子线程获取信号量进行读操作

*/

include

include

include

include

include //信号量相关

include //线程相关

define N 32

char buf[N];
sem_t sem;

//子线程读取函数声明
void func_read(void arg)
{

while( 1 )
{
    sem_wait(&sem);
    printf("buf=%s",buf);
}

}

int main()
{

//初始化一个信号量,设置为线程间使用,设置初值即资源数量为0
//注意信号量的初始化要放在进程或者线程创建之前,主要因为多个线程执行顺序无先后
if(sem_init(&sem, 0, 0) < 0)  
{
    perror("sem_init");  //出错返回
    exit(-1);  //非正常退出返回-1,(正常的退出返回0)
}

pthread_t a_pthread;
//创建一个线程,创建成功后执行func_read函数
if(pthread_create(&a_pthread, NULL, func_read, NULL) < 0)
{
    perror("create a_pthread fail!!!");
    exit(-1);
}

printf("输入quit退出\n");
//主进程中写操作 
do
{
    fgets(buf, 32, stdin);  //将标准输入内容写入buf,注意程序运行时,在获取到用户输入之前,该线程一直是阻塞状态
    sem_post(&sem);  //注意此前信号量为0,post释放信号量会使值加1,则sem(资源数)为1个,处于等待态的子线程就可以获取该信号量往下执行
}
while(strncmp(buf, "quit", 4) != 0);  //如果输入不为quit

return 0;

}

运行结果,线程1输入,线程2打印,输入quit退出

你可能感兴趣的:(信号量,linux)