4

我有一个带有两个线程的 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 );     
}

输出(我确定该消息之前存在):

输出

4

1 回答 1

2

C 标准根本没有指定标准输入流和标准输出流之间的任何关联。特别是,它没有指定一个线程在通过任何标准函数从标准输入读取时阻塞应该导致任何输出函数阻塞。

但是,该标准也没有相反的说法,即一个线程阻塞输入输入 fromstdin不得导致另一个阻塞输出到stdout. 是否发生这种情况将取决于 C 实现,并且可能取决于与之相关联的特定stdin设备stdout

您似乎正在使用 Windows C 实现,stdin并且stdout两者都连接到 CMD.EXE 窗口。Windows 有很多特性,我倾向于猜测您观察到的阻塞就是其中之一。我不希望在 Linux 或 OSX 上出现同样的情况,但这并不意味着它是错误的。

于 2018-12-11T21:18:24.357 回答