线程同步一例
功能:主线程创建一个副线程,然后主线程负责将键盘输入的内容写到buffer,然后通知副线程将数据打印,打印完后,副线程通知主线程继续从输入缓冲区中将读到的字符写到buffer数组。当输入quit命令时,主线程退出,副线程也会随着主线程的结束而自动结束。
1 #include <stdio.h> 2 #include <pthread.h> 3 #include <semaphore.h> 4 #include <stdlib.h> 5 #include <string.h> 6 7 8 char buffer[128]; 9 sem_t sem1; 10 sem_t sem2; 11 12 void *fun(void * arg) 13 { 14 15 while(1) 16 { 17 if(sem_wait(&sem2) == -1) //读之前申请读信号 18 { 19 perror("sem_wait sem2"); 20 exit(-1); 21 } 22 printf(">>>%s",buffer); 23 if(sem_post(&sem1) == -1) //读完了后发送写信号 24 { 25 perror("sem_wait sem2"); 26 exit(-1); 27 } 28 } 29 30 } 31 32 int main(void) 33 { 34 35 pthread_t thread; 36 37 if(sem_init(&sem1, 0, 1) == -1) //将写信号初始化为1 38 { 39 perror("sem_init"); 40 exit(-1); 41 } 42 if(sem_init(&sem2, 0, 0) == -1) //将读信号初始化为0 43 { 44 perror("sem_init"); 45 exit(-1); 46 } 47 if(-1 == pthread_create(&thread, NULL, fun, NULL)) //创建线程 48 { 49 exit(-1); 50 } 51 52 do 53 { 54 if(sem_wait(&sem1) == -1) //写之前申请写资源 55 { 56 perror("sem_wait sem1"); 57 exit(-1); 58 } 59 fgets(buffer, 128, stdin); 60 if(sem_post(&sem2) == -1) //写之后发送读资源 61 { 62 perror("sem_wait sem1"); 63 exit(-1); 64 } 65 }while(strncmp(buffer, "quit", 4) != 0); //输入quit,主线程结束,副线程也就退出 66 67 68 return 0; 69 }
本文来自博客园,作者:摩斯电码,未经同意,禁止转载