用互斥信号量进行线程同步的一个问题

yujixi123 2010-07-17 02:30:26
问题:主线程输入一行字符 新创建的线程统计这行字符的个数 程序如下(函数返回值检查操作略):
#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可能依然调度主线程(即输入字符串的线程)执行,即继续输入字符串,从而把前一次输入的字符串给淹没了啊。
我的想法错在哪? 欢迎指教




...全文
275 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2010-07-18
  • 打赏
  • 举报
回复
帮顶。
DotCpp 2010-07-17
  • 打赏
  • 举报
回复
虽然辅线程由阻塞变为了就绪,但这个时候,我认为,CPU可能依然调度主线程(即输入字符串的线程)执行,即继续输入字符串,从而把前一次输入的字符串给淹没了啊。

因为你想输入的速度远比CPU慢。还没来得及输入就CPU就已经执行了辅助线程里的显示了,所以他的代码正常。

东大坡居士 2010-07-17
  • 打赏
  • 举报
回复
你的想法应该没有错,
要是想避免这种情况应该在主线程里面也加上sem_wait(&bin_sem); 这个操作

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧