我正在测试在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++;}
}
答案 0 :(得分:6)
多个线程应该同时运行。这应该在你的代码中发生。
我猜测printf
调用已执行,但不会立即生成输出。控制台输出可能是行缓冲的,因此只有在打印换行符或刷新时才会显示。
尝试在您打印的字符串末尾添加\n
,或在fflush(stdout)
之后添加printf
。
编辑:有关线路缓冲的评论......
当标准C库决定控制台写入相对昂贵并且仅应尝试连贯的文本块时,会发生行缓冲。相干块的一个简单定义是一条线。在等待输入换行符时,C lib会将printf
个调用的内容存储在一块内存中,并附加后续的printf
s
答案 1 :(得分:0)
根据我对pthreads的理解,你还没有实际启动线程。在pthread_create
之后,尝试添加pthread_join(tid, NULL);
并查看其是否有效。