在C中运行并发线程?

时间:2013-10-08 16:15:45

标签: c multithreading concurrency

我正在测试在C中运行并发线程的行为,其中一个线程函数无限运行。我的问题是为什么不在下面的代码中,“你好!!!”得到印刷?我以为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++;}

}

2 个答案:

答案 0 :(得分:6)

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

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

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

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

答案 1 :(得分:0)

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