在C中运行并发线程?
我正在用一个无限运行的线程函数测试在C中运行并发线程的行为。我的问题是,在下面的代码中,“HELLO!!!”为什么不打印出来?我以为调用了pthread_create(),然后它立即进入循环的下一个迭代,为什么代码要等待第一个pthread_create()完成?多个线程不应该同时运行吗在C中运行并发线程?,c,multithreading,concurrency,C,Multithreading,Concurrency,我正在用一个无限运行的线程函数测试在C中运行并发线程的行为。我的问题是,在下面的代码中,“HELLO!!!”为什么不打印出来?我以为调用了pthread_create(),然后它立即进入循环的下一个迭代,为什么代码要等待第一个pthread_create()完成?多个线程不应该同时运行吗 void main(int argc, char **argv) { pthread_t tid; int i; //Create 4 inf threads for (i=0
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++;}
}
void main(int argc,char**argv)
{
pthread_t tid;
int i;
//创建4个inf线程
对于(i=0;i<4;i++)
{
//printf(“你好!\n”);
//pthread_create(&tid,NULL,thread_incr,(void*)i);
pthread_create(&tid,NULL,t_nostop,(void*)i);
printf(“你好!!!”;//这件亚麻布从来没有印过!!
}
pthread_exit(NULL);
}
void*t_nostop(void*argp)
{
int i=1;
int t_num=(int)argp;
而(i==1){t_num++;}
}
多个线程应该同时运行。这应该发生在您的代码中
我猜printf
调用会被执行,但不会立即生成输出。控制台输出可能是行缓冲的,因此只有在打印换行或刷新时才会显示
尝试在打印的字符串末尾添加\n
,或在printf
之后添加fflush(stdout)
编辑:询问有关行缓冲的评论。。。
当标准C库决定控制台写入相对昂贵且仅应尝试对连贯的文本块进行写入时,就会发生行缓冲。相干块的一个简单定义是直线。在等待输入换行符时,C库将
printf
调用的内容存储在内存块中,并附加后续的printf多个线程应该同时运行。这应该发生在您的代码中
我猜printf
调用会被执行,但不会立即生成输出。控制台输出可能是行缓冲的,因此只有在打印换行或刷新时才会显示
尝试在打印的字符串末尾添加\n
,或在printf
之后添加fflush(stdout)
编辑:询问有关行缓冲的评论。。。
当标准C库决定控制台写入相对昂贵且仅应尝试对连贯的文本块进行写入时,就会发生行缓冲。相干块的一个简单定义是直线。在等待输入换行符时,C库将printf
调用的内容存储在内存块中,并附加后续的printf
s根据我对pthreads的理解,实际上还没有启动线程。尝试在pthread\u create
之后添加pthread\u join(tid,NULL)编码>并查看它是否有效。根据我对pthreads的理解,您实际上还没有启动线程。尝试在pthread\u create
之后添加pthread\u join(tid,NULL)
并查看它是否工作。注意这将自动完成,但您调用了pthread\u exit
而不是从main
返回。好的,谢谢!已添加\n并且运行良好!行缓冲的含义是什么,为什么它在没有换行符的情况下发生?很高兴这有帮助。当操作系统决定控制台写入相对昂贵且仅应尝试对连贯的文本块进行写入时,就会发生行缓冲。相干块的一个简单定义是直线。在等待输入换行符时,操作系统将printf
调用的内容存储在内存块中,并附加后续的printf
s.@simonc:为什么不在答案中添加您的注释?:-)Printf和threads非常有趣。在Linux上,线程中的printfs保证在控制台上独立运行。在后台有缓冲区、信号量等,以确保一个线程的printf不会与另一个线程的printf混淆。fprintf到stderr没有缓冲,因此这些可以在控制台上显示在应该首先打印的printf之前!此外,并非所有操作系统都会使用此解除混合。请注意,这将自动完成,但您调用了pthread\u exit
,而不是从main
返回。好的,谢谢!已添加\n并且运行良好!行缓冲的含义是什么,为什么它在没有换行符的情况下发生?很高兴这有帮助。当操作系统决定控制台写入相对昂贵且仅应尝试对连贯的文本块进行写入时,就会发生行缓冲。相干块的一个简单定义是直线。在等待输入换行符时,操作系统将printf
调用的内容存储在内存块中,并附加后续的printf
s.@simonc:为什么不在答案中添加您的注释?:-)Printf和threads非常有趣。在Linux上,线程中的printfs保证在控制台上独立运行。在后台有缓冲区、信号量等,以确保一个线程的printf不会与另一个线程的printf混淆。fprintf到stderr没有缓冲,因此这些可以在控制台上显示在应该首先打印的printf之前!此外,并非所有操作系统都是如此。