功能:主线程创建一个副线程,然后主线程负责将键盘输入的内容写到buffer,然后通知副线程将数据打印,打印完后,副线程通知主线程继续从输入缓冲区中将读到的字符写到buffer数组。当输入quit命令时,主线程退出,副线程也会随着主线程的结束而自动结束。
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <stdlib.h>
#include <string.h>
char buffer[128];
sem_t sem1;
sem_t sem2;
void *fun(void * arg)
{
while(1)
{
if(sem_wait(&sem2) == -1) //读之前申请读信号
{
perror("sem_wait sem2");
exit(-1);
}
printf(">>>%s",buffer);
if(sem_post(&sem1) == -1) //读完了后发送写信号
{
perror("sem_wait sem2");
exit(-1);
}
}
}
int main(void)
{
pthread_t thread;
if(sem_init(&sem1, 0, 1) == -1) //将写信号初始化为1
{
perror("sem_init");
exit(-1);
}
if(sem_init(&sem2, 0, 0) == -1) //将读信号初始化为0
{
perror("sem_init");
exit(-1);
}
if(-1 == pthread_create(&thread, NULL, fun, NULL)) //创建线程
{
exit(-1);
}
do
{
if(sem_wait(&sem1) == -1) //写之前申请写资源
{
perror("sem_wait sem1");
exit(-1);
}
fgets(buffer, 128, stdin);
if(sem_post(&sem2) == -1) //写之后发送读资源
{
perror("sem_wait sem1");
exit(-1);
}
}while(strncmp(buffer, "quit", 4) != 0); //输入quit,主线程结束,副线程也就退出
return 0;
}