【问题标题】:Understanding pthread_detach了解 pthread_detach
【发布时间】: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 的标题。哦,你是如何编译/链接的?

标签: c pthreads


【解决方案1】:

在我看来,您使用的是标准库的非线程安全版本(prints、fflush...)。我已经在旧的类 unix 实时系统上看到了这种(显然)非逻辑行为。有两种不同版本的 std 库,一种用于单线程模式,一种用于多线程。当然,默认是单线程的... 一般来说,对文件指针和类似事物的访问应该使用互斥锁进行序列化。在您的程序中,有两个线程终止,每个可能都想隐式调用 fflush,但由于底层缓冲区并不意味着并发访问,因此两个刷新都可能将相同的数据写入输出文件描述符。

【讨论】:

    猜你喜欢
    • 2011-08-27
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 2018-08-20
    • 2014-02-15
    • 2023-03-07
    • 2010-09-13
    • 1970-01-01
    相关资源
    最近更新 更多