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

时间:2015-02-21 09:03:07

标签: c linux multithreading sleep

我在网上看到了以下关于Linux中线程的代码。但是当我运行它时,所有线程似乎都在睡觉,而不仅仅是主线程。为什么?此外,没有睡眠(5),语句 - “成功创建的线程”运行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;
}

1 个答案:

答案 0 :(得分:1)

为什么你认为所有线程都在睡觉?阅读一些pthreads tutorial&amp; pthreads(7)

看起来你的线程很快被终止了。您应该使用pthread_join(3)

加入他们(例如在sleep之前或main内的某个地方)
 for (int i=0; i<2; i++) {
    void* retval = NULL;
    pthread_join(tid[i], &retval);
    // in your case, since doSomething gives NULL :
    assert (retval == NULL); 
 }

或者你应该创建分离的线程,请参阅pthread_create(3)&amp; pthread_attr_init(3)中的示例&amp; pthread_attr_setdetachstate(3)等......

您应该编码(因为您希望doSomeThing获得NULL参数):

void* doSomeThing(void* arg) {
   assert (arg == NULL);

BTW,请使用gcc -Wall -Wextra -g进行编译,并了解如何使用gdb调试器。

你可能应该在适当的地方拨打fflush(3) (因为stdio(3)通常是buffered),例如在fflush(NULL);

结束时致电doSomeThing

了解undefined behavior并努力避免它。

在您希望输出的线程内部fflush(NULL);很重要(至少在结束之前)。您的问题与sleep无关,而与缓冲无关。由于非常有效的性能原因,printf经常被缓冲。您还应该习惯使用printf结束\n格式控制字符串(因为这通常会刷新缓冲区)。仅将\n放在printf格式字符串的开头是一个坏习惯(它应该在最后)。


BTW,通过更正void* doSomething(void*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

因此,问题中给出的代码在我的计算机上不起作用,如问题中所述。因此,Harsh S. Kulshrestha应该通过提供完全源代码,完整编译命令和完全输出来编辑他的问题。 FWIW,我的系统是x86-64上的Linux / Debian / Sid,gcc是版本4.9.2,libc是Debian GLIBC 2.19-15