C++ pthread-如何在不调用join的情况下开始运行新线程?
我想从主线程开始一个新线程。我不能使用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
基本上我需要的是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()吗?这取决于设计。您可以这样做,但它会让线程自己运行:这是一种我不喜欢的资源泄漏。(但我们正在偏离原来的问题)