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