【发布时间】:2012-11-10 06:08:45
【问题描述】:
以下打印件
In Main()
Hello World
Hello World
为什么这会打印两次 Hello World?如果我使用 pthread_join() 会出现所需的输出(只有一个 Hello World 前面是 In Main()。
#include <pthread.h>
void *thread_func(void *arg);
int main(int argc, char **argv)
{
int s;
void *res;
pthread_t t1;
s = pthread_create(&t1, NULL, thread_func, "Hello World\n");
if (s != 0)
printf("Err\n");
printf("In Main()\n");
s = pthread_detach(t1);
if (s != 0)
printf("Err\n");
return 0;
}
void *thread_func(void *arg)
{
char *s = (char *)arg;
printf("%s", s);
pthread_exit(0);
}
我知道 pthread_detach 告诉库在线程终止后释放 pthread 使用的所有资源......并且由于我在 thread_func 结束时终止它,所以一切都应该没问题吧?
我在这里错过了什么?
【问题讨论】:
-
小点:
char *s = (char *)arg;应该是char *s = arg; -
另外,这会为我打印 0、1 或 2 次“Hello World”。请记住,除非明确指定,否则线程不需要相互等待,您在此处遇到的称为未指定行为(不是未定义行为),这很好。
-
我无法用您提供的代码重现问题。对于
pthread_detach,我只看到一份“Hello World”消息的副本。我尝试在主线程中添加对sleep(3)的调用,以确保线程有机会完成运行,但我仍然只看到一次消息。 -
@H2CO3。我不知道如何遵循这个。和你一样,我也得到 0、1 或 2 个 Hello World。但是,对我来说,这在逻辑上还没有意义(我是 pthreads 的新手)。你说行为是未指定的,但如果你从逻辑上考虑,一旦 thread_func 结束,线程就会终止执行。
-
@JohnReddock:您没有包括
printf的标题。哦,你是如何编译/链接的?