gpt4 book ai didi

c - pthread_detach 不会改变任何东西

转载 作者:行者123 更新时间:2023-11-30 16:34:41 24 4
gpt4 key购买 nike

我理解 pthread_detach(pid) :“当该线程终止时可以回收该线程的存储”(根据 http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_detach.html )但是,我理解这意味着一旦 pid 线程完成执行,其内存将被释放,我们将无法再次运行它,或对其调用 join 。但是,我尝试了以下代码:

#include <stdio.h>
#include <pthread.h>

void* myFunction (void* arg)
{
printf("Hello World from thread!\n");

}

int main()
{
pthread_t tid;
pthread_create(&tid, NULL, myFunction, NULL);
//pthread_join(tid, NULL);

int isDetached = -10;
isDetached = pthread_detach(tid);
printf("Is my thread detached: %d\n", isDetached);

int i;
for (i = 0; i<15; i++)
printf("%d\n", i);

pthread_create(&tid, NULL, myFunction, NULL);
pthread_join(tid, NULL);

for (i = 0; i<15; i++)
printf("%d\n", i);

return 0;

}

我得到以下信息: result

如果我理解正确的话,既然我做了 pthread_detach(tid),我应该做不到

pthread_create(&tid, NULL, myFunction, NULL);
pthread_join(tid, NULL);

之后,我还是这么做了,而且效果很好。那么,如果我们仍然可以运行线程并加入它,那么执行 othread_detach(pid) 的真正目的是什么?

非常感谢!

最佳答案

pthread_detach 只是告诉您的程序 tid 的当前实例不会再次加入 (pthread_join),并释放所有 pthread 句柄& tid 实例上的对象。

由于您调用了 pthread_detach,如果您尝试 pthread_join 该线程,则不会,因为它已被释放并处置。

我已在分离调用之后将 pthread_join 添加到您的代码中,您可以看到没有按预期发生任何情况。

#include <stdio.h>
#include <pthread.h>

void * myFunction (void *arg)
{
printf ("Hello World from thread!\n");

}

int main ()
{
pthread_t tid;
pthread_create (&tid, NULL, myFunction, NULL);
//pthread_join(tid, NULL);

int isDetached = -10;
isDetached = pthread_detach (tid);
printf ("Is my thread detached: %d\n", isDetached);

/* ADDED FOR STACK OVERFLOW */
pthread_join (tid, NULL);

int i;
for (i = 0; i < 15; i++)
printf ("%d\n", i);

pthread_create (&tid, NULL, myFunction, NULL);
pthread_join (tid, NULL);

for (i = 0; i < 15; i++)
printf ("%d\n", i);

return 0;
}

我不确定混淆是什么,但如果您在第二次调用 pthread_create 时期望不同的行为;请注意,这实际上是为您创建一个新的 tid 实例。因此,您的第二个 join 调用将运行该线程。

关于c - pthread_detach 不会改变任何东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49242346/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com