(编辑)保持线程活着而不改变主要

时间:2013-03-16 08:59:03

标签: c pthreads

我希望能够开始一个pthread并且它将保持活力 即使main()已完成。

我无法访问main()。

正常的行为是,如果一个线程被启动并且没有来自main()的“join_thread”,它将在main完成运行时终止。

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

2 个答案:

答案 0 :(得分:2)

您可以使用pthread_exit(..)而不是main()结束return 0。此函数调用不返回。这样,您的主线程将退出,但您的过程不会完成。

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

答案 1 :(得分:0)

您可以尝试使用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;
}

代码中的某处:

...
atexit(join_all_threads);
...

在线程代码中:

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

    ...
}

编辑:添加了on_exit

如果你碰巧有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());
}