用互斥信号量进行线程同步的一个问题
问题:主线程输入一行字符 新创建的线程统计这行字符的个数 程序如下(函数返回值检查操作略):
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#include <stdlib.h>
#define WORK_SIZE 1024
char work_area[WORK_SIZE]; //线程共享区
void* thread_function(void*); //辅线程执行函数
sem_t bin_sem; //互斥信号量
int main()
{
int res;
pthread_t a_thread;
void *thread_result;
res = sem_init(&bin_sem, 0, 0); //初始化信号量
res = pthread_create(&a_thread, NULL, thread_function, NULL); //创建辅线程,用于统计字符个数
printf("Input some text, Enter 'end' to finish\n");
while (strncmp("end", work_area, 3) != 0)
{
fgets(work_area, WORK_SIZE, stdin);
sem_post(&bin_sem);
}
printf("\nWaiting for thread to finish...\n");
res = pthread_join(a_thread, &thread_result);
printf("Thread joined\n");
sem_destroy(&bin_sem);
exit(EXIT_SUCCESS);
}
void* thread_function(void *arg)
{
sem_wait(&bin_sem); //初始时刻,还没有输入,线程阻塞
while (strncmp("end", work_area, 3) != 0)
{
printf("You input %d characters\n", strlen(work_area) - 1);
sem_wait(&bin_sem); //阻塞等待主线程输入字符串
}
pthread_exit(NULL);
}
这是《Linux程序设计》中的一个例子,经运行,是没有问题的。
其想法是这样的:
当主线程输入到达时,释放信号量,sem_post(&bin_sem);,以允许第二个线程在第一个线程再次读取键盘输入之前统计出字符的个数。
我的问题就在这里,执行完
while (strncmp("end", work_area, 3) != 0)
{
fgets(work_area, WORK_SIZE, stdin);
sem_post(&bin_sem);
}
之后,辅线程执行
sem_wait(&bin_sem); //初始时刻,还没有输入,线程阻塞
虽然辅线程由阻塞变为了就绪,但这个时候,我认为,CPU可能依然调度主线程(即输入字符串的线程)执行,即继续输入字符串,从而把前一次输入的字符串给淹没了啊。
我的想法错在哪? 欢迎指教