Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中运行并发线程?_C_Multithreading_Concurrency - Fatal编程技术网

在C中运行并发线程?

在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

我正在用一个无限运行的线程函数测试在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++;}

}
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之前!此外,并非所有操作系统都是如此。