C 为什么我的所有线程都使用sleep()睡眠?

C 为什么我的所有线程都使用sleep()睡眠?,c,linux,multithreading,sleep,C,Linux,Multithreading,Sleep,我看到了下面一段关于web上Linux线程的代码。但是当我运行它时,所有线程似乎都在休眠,而不仅仅是主线程。为什么?另外,在没有sleep5的情况下,创建的语句线程成功运行了3次,而不是2次?有人能解释一下这种行为吗?谢谢 使用以下方式编译: gcc-pthread check.c 以及我的o/p: 第一线程处理 线程创建成功 第二线程处理 线程创建成功 前两行的打印间隔为5秒,后两行的打印间隔为5秒。为什么孩子们睡觉而不是主线程 #include<stdio.h> #include

我看到了下面一段关于web上Linux线程的代码。但是当我运行它时,所有线程似乎都在休眠,而不仅仅是主线程。为什么?另外,在没有sleep5的情况下,创建的语句线程成功运行了3次,而不是2次?有人能解释一下这种行为吗?谢谢 使用以下方式编译: gcc-pthread check.c

以及我的o/p: 第一线程处理 线程创建成功 第二线程处理 线程创建成功

前两行的打印间隔为5秒,后两行的打印间隔为5秒。为什么孩子们睡觉而不是主线程

#include<stdio.h>
#include<string.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
pthread_t tid[2];

void* doSomeThing()

{
    unsigned long i = 0;
    pthread_t id = pthread_self();

    if (pthread_equal(id,tid[0]))
    {
        printf("\n First thread processingn");
    }
    else
    {
        printf("\n Second thread processingn");
    }
    return NULL;
}
int main(void)
{
    int i = 0;
    int err;
    while (i < 2)
    {
        err = pthread_create(&(tid[i]), NULL, &doSomeThing, NULL);
        sleep(5);
        if (err != 0)
            printf("\ncan't create thread [%s]", strerror(err))
            else

                printf("\n Thread created successfullyn");
        i++;
        // sleep(5);
    }
    pthread_join(tid[0],NULL);
    pthread_join(tid[1],NULL);

    return 0;
}

为什么你认为你所有的线程都在睡觉?读一些,

看起来你的线程很快就被终止了。你应该加入他们,比如在睡觉前,或者在主卧室里的某个地方

顺便说一句,请使用gcc-Wall-Wextra-g编译并学习如何使用gdb调试器

你可能应该在适当的地方打电话,因为它经常是空的,例如call-fflushNULL;在doSomeThing的末尾

阅读并努力避免它

重要的是要做到这一点;在线程内部,您希望至少在结束它们之前从中获得输出。你的问题与睡眠无关,而是与缓冲有关。出于非常有效的性能原因,printf经常被缓冲。您还应该养成以\n结尾printf格式控制字符串的习惯,因为这通常会刷新缓冲区。只在printf格式字符串的开头放一个\n是一个坏习惯,应该放在末尾

顺便说一句,通过更正void*doSomethingvoid*arg行,因为问题的原始版本中给出了void arg,所以代码甚至不会编译!我在编译时观察到以下输出:

 % gcc -Wall -g x.c -pthread -o xx
   x.c: In function 'doSomeThing':
   x.c:11:19: warning: unused variable 'i' [-Wunused-variable]
        unsigned long i = 0;
                      ^
然后执行以下操作:

   % ./xx

   Thread created successfully

   First thread processing

   Thread created successfully

   Second thread processing

因此,问题中给出的代码在我的计算机上的行为与问题中解释的不一样。因此,他应该通过给出准确的源代码、完整的编译命令和准确的输出来编辑他的问题。FWIW,我的系统是x86-64上的Linux/Debian/Sid,gcc是4.9.2版,libc是Debian GLIBC 2.19-15

为什么doSomeThing会采用void arg?您可能想了解线程的分离状态与可连接状态,了解为什么线程看起来不像是结束的。供您参考:在编写时,您的代码不会编译。应该是void*arg但是你写了void arg顺便说一下,我没有观察到你描述的行为。我相信你编译的代码不是你展示给我们的代码。关于缺少的输出,调用fflush是一种方法。更好的方法是在行的末尾\n而不是开头添加一个换行符。原因是许多实现的默认设置是输出是行缓冲的,因此写一个换行符会自动刷新输出缓冲区。我认为pthread_join的第一个参数是pthreat_t type,而不是pthread_t*@BasileStarynkevitch谢谢你的回答,但我认为thread tid[1]保持休眠,因为第二个线程处理语句仅在5秒后才会打印。是否向fflush添加了调用?如果没有它,数据可能仍然会被缓冲,并且在您希望它出现时不会出现……是的,我这样做了。另外,当我在调用线程的语句之后将sleep5移到循环中时,即在此之后:err=pthread_create&tid[I],NULL,&doSomeThing,NULL;两个线程都和主线程一起挂起。如果父母被停职,孩子会被停职吗?@BasileStarynkevitch,谢谢你的持续帮助。我已经在这里发布了我的编译代码:我希望你现在理解我的问题。
 % gcc -Wall -g x.c -pthread -o xx
   x.c: In function 'doSomeThing':
   x.c:11:19: warning: unused variable 'i' [-Wunused-variable]
        unsigned long i = 0;
                      ^
   % ./xx

   Thread created successfully

   First thread processing

   Thread created successfully

   Second thread processing