【发布时间】:2019-05-12 22:02:52
【问题描述】:
我有一个带有两个线程的 C 程序,其中一个线程几乎一直阻塞在 fgets() 中等待用户输入。第二个线程可能需要打印到终端,而第一个线程在 fgets() 上被阻塞。
从我的测试看来,程序等待第一个线程上的fgets() 返回,然后第二个线程可以打印。
这是它的工作原理还是我可以在另一个线程被 fgets() 阻塞时打印?
此实现在 eCos(嵌入式可配置操作系统)上运行。
线程锁定在fgets():
int my_getline (char** argv, int argvsize)
{
static char line[MAX_LINE];
char *p;
int argc;
fgets(line, MAX_LINE, stdin);
for (argc=0,p=line; (*line != '\0') && (argc < argvsize); p=NULL,argc++) {
p = strtok(p, " \t\n");
argv[argc] = p;
if (p == NULL) return argc;
}
argv[argc] = p;
return argc;
}
线程试图打印:
while(1){
unsigned char bufr[50];
read_until(bufr);
if (bufr[1] == (unsigned char)NMFL ){
cyg_mutex_lock(&scree_mtx);
printf("Memory half full!\n");
cyg_mutex_unlock(&scree_mtx);
continue;
}
cyg_mbox_put( mbx_serial_userH, bufr );
}
输出(我确定该消息之前存在):
【问题讨论】:
-
一个等待输入的线程不应阻塞另一个试图写入输出的线程。
-
您的输出是否以
\n结尾?stdout是行缓冲的,因此在您打印换行符之前它不会被刷新。 -
是的,
printf()以\n@Barmar 结尾 -
通过编辑,这个问题没有意义。显示的输出似乎与添加的源没有任何关系。
-
我想我的意思是 - 从这些代码 sn-ps 和输出 sn-p 中非常不清楚你如何得出结论它被阻止尝试输出。你能提供更接近minimal test case的东西吗?
标签: c multithreading printf fgets ecos