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

我在网上看到了关于Linux线程的下面一段代码。 但是当我运行它,所有的线程似乎睡觉,而不是只是主线程。 为什么? 另外,没有睡眠(5),“线程创build成功”的语句运行3次而不是2次? 有人可以解释这种行为吗? 感谢编译使用:gcc -pthread check.c

和我的o / p:第一个线程processingn线程创build成功n第二个线程processingn线程创build成功n

前两行以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; } 

你为什么觉得你所有的线程都在睡觉? 阅读一些pthreads教程和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_attr_init(3) & pthread_attr_setdetachstate(3)等中的pthread_create(3) &示例….

你应该编码(因为你期望doSomeThing获得一个NULL参数):

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

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

你可能应该在适当的地方调用fflush(3) (因为stdio(3)经常被缓冲 ),例如调用fflush(NULL);doSomeThing结束

阅读关于未定义的行为,并努力避免它。

执行fflush(NULL);很重要fflush(NULL); 你期望输出的内部线程(至少在结束之前)。 你的问题与sleep无关,但与缓冲有关。 而且为了非常有效的性能原因, printf经常被缓冲。 你也应该习惯用\n结束printf格式的控制字符串(因为这往往是冲洗缓冲区)。 把一个\n只在一个printf格式字符串的开头是一个坏习惯(它应该在最后)。


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

  % gcc -Wall -g xc -pthread -o xx xc: In function 'doSomeThing': xc: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 

所以在问题中给出的代码在我的电脑上并不像在问题中所解释的那样。 因此, 苛刻的S. Kulshrestha应该通过给出确切的源代码,完整的编译命令和确切的输出来编辑他的问题。 FWIW,我的系统是x86-64上的Linux / Debian / Sid, gcc是版本4.9.2, libc是Debian GLIBC 2.19-15