我理解pthread_detach(pid):“当线程终止时,可以回收线程线程的存储”(根据Capitalize) 但是,我理解这意味着一旦pid线程完成执行,它的内存将被释放,我们将无法再次运行它,或者调用它的连接。 但是,我尝试了以下代码:
pthread_create(&tid, NULL, myFunction, NULL);
pthread_join(tid, NULL);
}
我得到以下内容: http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_detach.html
如果我理解正确,因为我做了pthread_detach(tid),我应该无法做到
use Mojolicious;
my $m = Mojolicious->new->log(Mojo::Log->new);
my $r = $m->renderer;
push @{$r->paths}, './templates';
my $c = Mojolicious::Controller->new->app($m);
my ($output, $format) = $r->render($c, { template => 'index' });
print $output
之后,我做了,它完美无缺。那么,如果我们仍然可以运行线程并加入它,那么做othread_detach(pid)的真正目的是什么?
非常感谢!
答案 0 :(得分:0)
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
的新实例。因此,您的第二个连接调用将运行该线程。
答案 1 :(得分:0)
pthread_t tid;
pthread_create(&tid, NULL, myFunction, NULL);
这会创建一个新线程,并且后续调用pthread_detach(pid)
会分离创建的线程。现在
pthread_create(&tid, NULL, myFunction, NULL);
这会创建一个新线程,然后你调用了一个连接,它基本上等待新创建的线程的完成,而不是已经分离的线程。
您可以查看下面附带的代码。当您运行此代码时,即使在调用join之后,已分离的线程也会打印,即myfunc1仍在pthread_join
之后打印。
#include <stdio.h>
#include <pthread.h>
void *myFunction2 (void *arg)
{
printf("Hello World from func2!\n");
}
void *myFunction1 (void *arg)
{
while(1) {
printf("Hello World from func1\n");
}
}
int main()
{
pthread_t tid;
pthread_create(&tid, NULL, myFunction1, NULL);
//pthread_join(tid, NULL);
int isDetached = -10;
isDetached = pthread_detach(tid);
printf("Is my thread detached: %d\n", isDetached);
int i;
pthread_create(&tid, NULL, myFunction2, NULL);
pthread_join(tid, NULL);
for (i = 0; i<15; i++)
printf("%d\n", i);
return 0;
}
答案 2 :(得分:0)
您的变量tid
不一个帖子。你的程序没有启动一个线程两次,它会创建两个完全不同的线程。
实际线程是操作系统中存在的对象。您的tid
变量只是一个&#34;句柄&#34;您可以用来与线程进行交互。您对pthread_create(&tid,...)
的第二次调用是重新使用handle变量,将其指向一个新的不同线程。