0

我正在使用无限运行的线程函数测试在 C 中运行并发线程的行为。我的问题是为什么在下面的代码中没有“HELLO!!!” 被打印?我认为 pthread_create() 被调用,然后立即进入循环的下一次迭代,为什么代码要等待第一个 pthread_create() 完成?多个线程不应该同时运行吗?

void main(int argc, char **argv)
{
    pthread_t tid;
    int i;

    //Create 4 inf threads
    for (i=0;i< 4;i++)
    {
        //printf("hello!\n");
        //pthread_create(&tid, NULL, thread_incr, (void *)i);
        pthread_create(&tid, NULL, t_nostop, (void *)i);
        printf("HELLO!!!"); //This linen is NEVER printed!!
    }

    pthread_exit(NULL);
}

void* t_nostop(void * argp)
{
    int i=1;
    int t_num=(int) argp;
    while(i==1){t_num++;}

}
4

2 回答 2

6

多个线程应该同时运行。这应该发生在您的代码中。

我猜printf调用已执行但不会立即生成输出。控制台输出可能是行缓冲的,因此只会在您打印换行符或刷新时显示。

尝试\n在打印的字符串末尾添加或fflush(stdout)printf.

编辑:关于行缓冲的评论...
当标准 C 库决定控制台写入相对昂贵并且只应尝试用于连贯的文本块时,就会发生行缓冲。连贯块的一个简单定义是一条线。在等待输入换行符时,C 库将printf调用的内容存储在一块内存中,并附加后续printf的 s

于 2013-10-08T16:18:51.977 回答
0

根据我对 pthreads 的理解,您实际上还没有启动线程。尝试,在pthread_create添加之后pthread_join(tid, NULL);,看看它是否有效。

于 2018-05-15T02:34:10.283 回答