C (编辑)保持线程活动,而不更改主线程

C (编辑)保持线程活动,而不更改主线程,c,pthreads,C,Pthreads,我希望能够启动一个pthread,并且它将保持活动状态 即使main()已完成 我没有访问main()的权限 正常的行为是,如果一个线程启动时没有从main()中“连接线程”,那么它将在main运行完成时终止 在java中,默认情况是被调用的线程将保持活动状态。只有当所有线程都完成时,进程才会终止。不需要显式调用java“join_thread”。您可以在main()结尾使用一个而不是返回0。此函数调用不返回。这样,主线程将退出,但进程不会完成 当所有线程都完成时,或调用exit(..)时,进程

我希望能够启动一个pthread,并且它将保持活动状态 即使main()已完成

我没有访问main()的权限

正常的行为是,如果一个线程启动时没有从main()中“连接线程”,那么它将在main运行完成时终止


在java中,默认情况是被调用的线程将保持活动状态。只有当所有线程都完成时,进程才会终止。不需要显式调用java“join_thread”。

您可以在
main()
结尾使用一个而不是
返回0
。此函数调用不返回。这样,主线程将退出,但进程不会完成


当所有线程都完成时,或调用
exit(..)
时,进程将结束。

您可以尝试使用
atexit
函数

static pthread_t thread_ids[128];
static size_t    thread_count;
static pthread_mutex_t thread_mutex = PTHREAD_MUTEX_INITIALIZER;

static void join_all_threads()
{
    size_t i;
    for (i = 0; i < thread_count; i++)
    {
        pthread_join(&thread_ids[i], NULL);
    }
    thread_count = 0;
}
在线程代码中:

void *my_thread_fn(void *arg)
{
    pthread_mutex_lock(&thread_mutex);
    thread_ids[thread_count++] = pthread_self();
    pthread_mutex_unlock(&thread_mutex);

    ...
}
编辑:在退出时添加

如果您碰巧有
on_exit
功能,那么它会变得更简单:

void my_thrad_join(int code, void *arg)
{
    pthread_join((pthread_t)arg);
}

void *my_thread_fn(void *arg)
{
    on_exit(my_thread_join, (void*)pthread_self());
}

谢谢,这真是一个很棒的技巧,但我能不能不想更改main()你的描述在我看来有点矛盾。一方面,你说你想
main
隐式地连接它启动的其他线程(即等待那些线程终止),但你也说你“希望此线程在主线程到达其最后一行后继续运行”。那么它是哪一个?我希望的行为是,当启动线程时,它不会因为主线程到达其末端而终止。我不介意如何实现这一点,所以也可以“加入”“或者保持线索的活力对我有好处。在这种情况下,你应该重新措辞你的问题,让它更清楚你想要什么。现在可以对它进行解释,因为您希望从
main
返回始终加入程序创建的所有线程,而无需显式调用
pthread\u join
。但是根据您的评论,您实际上想要的是退出主线程,同时让其他线程继续运行(在他的回答中@pulstmaster解释了如何做)。
void my_thrad_join(int code, void *arg)
{
    pthread_join((pthread_t)arg);
}

void *my_thread_fn(void *arg)
{
    on_exit(my_thread_join, (void*)pthread_self());
}