C++ pthread-如何在不调用join的情况下开始运行新线程?

C++ pthread-如何在不调用join的情况下开始运行新线程?,c++,c,linux,multithreading,pthreads,C++,C,Linux,Multithreading,Pthreads,我想从主线程开始一个新线程。我不能使用join,因为我不想等待线程退出并恢复执行。 基本上我需要的是pthread_start(…)之类的东西,但我找不到它 编辑: 正如所有答案所建议的,create_thread应该启动thread,问题是在下面的简单代码中它不起作用。下面程序的输出是“主线程”。子线程似乎从未执行过。知道我哪里错了吗? 在Fedora14GCC4.5.1版上编译并运行 void *thread_proc(void* x) { printf ("sub thread.\n

我想从主线程开始一个新线程。我不能使用join,因为我不想等待线程退出并恢复执行。
基本上我需要的是pthread_start(…)之类的东西,但我找不到它

编辑:
正如所有答案所建议的,create_thread应该启动thread,问题是在下面的简单代码中它不起作用。下面程序的输出是“主线程”。子线程似乎从未执行过。知道我哪里错了吗?
在Fedora14GCC4.5.1版上编译并运行

void *thread_proc(void* x)
{
   printf ("sub thread.\n");
   pthread_exit(NULL);
}


int main()
{
    pthread_t t1;
    int res = pthread_create(&t1, NULL, thread_proc, NULL);
    if (res)
    {
        printf ("error %d\n", res);
    }

    printf("main thread\n");
    return 0;
}

只需将detached属性设置为on就可以创建线程。要实现这一点,可以在创建线程后调用
pthread\u detach
,也可以在创建线程之前调用
pthread\u attr\u setdetachstate


当一个线程被分离时,父线程不必等待它,也无法获取它的返回值。

当您分离它时,线程将自动启动

您不需要调用pthread\u create

static void *thread_body(void *argument) { /* ... */ }

int main(void) {
    pthread_t thread;
    pthread_create(&thread, NULL, thread_body, NULL);
    /* ... */

启动线程的函数是
pthread\u create
,而不是
pthread\u join
。您仅在准备等待时使用
pthread\u join
, 并重新同步,如果您分离线程,则无需使用 根本不可能。也可以从不同的线程进行连接

退出之前(通过调用
exit
或从
main
返回), 您必须确保没有其他线程正在运行。单程(但非单程) 唯一的)做这件事是通过加入所有你已经完成的线程
已创建。

join调用等待线程终止并退出


如果希望主线程在子线程执行时继续执行,请不要调用
join
:子线程将与主线程同时执行…

代码的行为取决于调度程序;主程序可能在创建的线程中的printf执行之前退出。我希望main()末尾的简单睡眠(几秒钟)将导致线程输出出现:)

您需要在man()末尾调用pthread_exit,这将导致main等待其他线程启动和退出。 或者可以显式调用pthread_join来等待新创建的线程


否则,当main返回时,进程将被终止,它创建的所有线程都将被终止。

此外,它也不能保证完整的答案,但如果你不加入你创建的线程,你的程序将在它们执行任何操作之前退出,因为主线程中的执行将继续。+1,退出之前不必等待其他线程。调用exit()将自动终止所有线程。如果您想优雅地终止,您可能需要使用pthread_barrier或pthread_join,不过。@Klas Lindback调用
exit()
将终止整个进程,这当然会终止所有线程。但这不是一个瞬间的过程;
exit
执行的步骤有一长串,终止线程已接近尾声。同时,调用了静态变量的析构函数,清理了内存结构(包括
malloc
?)等。与此同时,其他线程继续运行,最终使用了清理后的资源。C++11还增加了限制。哦,我现在明白了。我想知道如果我调用
pthread\u detach
,为什么我的线程没有被执行。。。我现在明白它是怎么工作的了。这实际上对从未退出(至少在理论上)的守护进程/服务是有好处的。谢谢程序的输出是什么?有关可能的原因,请参见用户396672的回答(主线程结束,操作系统在子线程完成之前杀死所有线程)。如果
main
返回
,则程序终止。在主线程中调用
pthread\u exit
,或者只添加pthread\u join(t1,NULL);返回0之前;谢谢@user396672这就是问题所在。我选择詹姆斯的答案,因为它符合原来的问题,但至少我给了你一票:)这是正确的答案。在从main()返回之前等待生成的线程运行的正确解决方案是在返回之前调用pthread_join(t1,NULL)。pthread_create()不能保证线程一返回就开始运行。此外,线程实际调度之前的时间是不确定的。要么用条件变量表示生成的线程已完成其作业,要么等待。是。是什么让您认为不调用join()不是标准的?(老实说,您仍然应该在主线程的末尾调用join(),以确保所有子线程在退出应用程序之前终止)您认为我可以只在类的析构函数的末尾调用detach()吗?这取决于设计。您可以这样做,但它会让线程自己运行:这是一种我不喜欢的资源泄漏。(但我们正在偏离原来的问题)