我看到了下面一段关于Linux在web上的线程的代码。但当我运行它时,所有的线程似乎都在休眠,而不仅仅是主线程。为什么?另外,在没有睡眠(5)的情况下,“线程创建成功”语句会运行3次而不是2次?有人能解释一下这种行为吗?谢谢
编译使用:
gcc-pthread check.c
我的订单号:
第一线程处理n
线程创建成功
第二线程处理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 tutorial&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)&pthread_attr_init(3)等中的pthread_attr_setdetachstate(3)&example。。。。
您应该已经编写了代码(因为您希望
doSomeThing
得到NULL
参数):void* doSomeThing(void* arg) {
assert (arg == NULL);
顺便说一下,请使用
gcc -Wall -Wextra -g
编译并学习如何使用gdb
调试器。您可能应该在适当的地方调用fflush(3)(因为stdio(3)通常是buffered),例如在
fflush(NULL);
结束时调用doSomeThing
阅读undefined behavior并努力避免它。
在期望输出的线程中执行
fflush(NULL);
是很重要的(至少在结束它们之前)。您的问题与sleep
无关,而是与缓冲有关。由于非常有效的性能原因,printf
经常被缓冲。您还应该养成用printf
结束\n
格式控制字符串的习惯(因为这通常是在刷新缓冲区)。只将\n
放在printf
格式字符串的开头是一个坏习惯(应该放在结尾)。顺便说一句,通过更正
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