功能:主线程创建一个副线程,然后主线程负责将键盘输入的内容写到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; }