为已经存在的线程调用pthread_detach?

时间:2018-08-16 17:17:10

标签: c pthreads

Dim UserChoice As String
UserChoice= ucase(Application.InputBox("Enter Type (A, B, C):  ", "Input Box Text", Type:=2))

if not iserror(application.match(left(UserChoice, 1), array("A", "B", "C"), 0)) then
    if cbool(instr(1, UserChoice, "A", vbtextcompare)) then
        'A is found, run code
    end if
    if cbool(instr(1, UserChoice, "B", vbtextcompare)) then
        'B is found, run code
    end if
    if cbool(instr(1, UserChoice, "C", vbtextcompare)) then
        'C is found, run code
    end if
end if

请参阅MWE。 它工作正常,但是我不确定这是否是实际定义的行为。 #include <pthread.h> #include <unistd.h> static void *tfunc(void *data) { return NULL; } int main(int argc, char **argv) { pthread_t t; pthread_create(&t, NULL, tfunc, NULL); sleep(1); pthread_detach(t); return 0; } 的手册页没有提到在退出的线程上调用它。

是的,我知道使用detached属性创建线程,但是我对此情况特别好奇。 pthread_detach对此案进行了提及,我认为pthread_join的效果还不错,但是我没有找到任何官方声明。

1 个答案:

答案 0 :(得分:6)

此代码完全合法,不会调用未定义的行为:

#include <pthread.h>
#include <unistd.h>

static void *tfunc(void *data)
{
    return NULL;
}

int main(int argc, char **argv)
{
    pthread_t t;

    pthread_create(&t, NULL, tfunc, NULL);
    sleep(1);
    pthread_detach(t);

    return 0;
}

并没有明确说明,但是POSIX documentation for pthread_detach()的措词必须定义并正确地在终止线程上调用pthread_detach()

  

pthread_detach()函数应指示实现   该线程的存储空间可以在该线程回收时回收   终止。如果线程尚未终止,则pthread_detach()不应   使其终止。

     

如果线程指定的值,则行为未定义   pthread_detach()的参数未引用可连接线程。

首先,请注意语句“如果线程尚未终止”。这意味着在线程已终止时调用pthread_detach()必须安全。

其次,请注意“如果...不引用可连接线程,则该行为是不确定的。”在发布的代码中,您创建的线程显然是可连接的-您未使用分离属性创建它,因此可以调用pthread_join()来检索其返回值。因此,这不是未定义的行为。

请记住,当调用pthread_join()pthread_detach()时,无法保证从线程A确保线程B仍在运行。因此,从任何其他线程上的任何线程进行调用(一次!)都必须安全。

此外,从POSIX文档的“基本原理”部分:

  

RATIONALE

     

pthread_join()pthread_detach()函数应最终   被创建的每个线程都将被调用,以便关联存储   可以回收该线程。

     

有人建议不需要“分离”功能;的   detachstate线程创建属性就足够了,因为线程   永远不需要动态分离。但是,至少需要   两种情况:

     
      
  1. pthread_join()的取消处理程序中,具有pthread_detach()函数以分离   pthread_join()正在等待的线程。没有它,那将是   使处理程序执行另一个pthread_join()尝试的必要   分离线程,这都将延迟取消   处理无限期并引入新的呼叫   pthread_join(),它本身可能需要取消处理程序。一种   在这种情况下,动态分离几乎是必不可少的。

  2.   
  3. 为了分离“初始线程”(在设置服务器线程的进程中可能需要这样做)。

  4.   

同样,虽然没有明确说明,但请注意pthread_join()pthread_detach()之间的隐含等效。