【问题标题】:(edit) keep threads alive without changing main(编辑)保持线程活着而不改变主
【发布时间】:2013-03-16 08:59:03
【问题描述】:

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

我无权访问 main()。

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

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

【问题讨论】:

  • 您的描述与 IMO 有点矛盾。一方面您说您希望main 隐式加入它已启动的其他线程(即等待这些线程终止),但随后您又说您“希望此线程在主要到达后继续运行到最后一行”。那么它是哪一个?
  • 我想要的行为是,当启动一个线程时,它不会因为 main 到达它的结尾而终止。我不介意如何实现这一点,因此“加入”或保持线程活着对我有好处。
  • 在这种情况下,您应该重新表述您的问题,以使其更清楚您想要什么。现在可以解释为您希望从main 返回始终加入您的程序创建的所有线程,而无需显式调用pthread_join。但根据您的评论,您真正想要的是退出主线程,同时让其他线程保持运行(@Thrustmaster 在他的回答中解释了如何做)。

标签: c pthreads


【解决方案1】:

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

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

【讨论】:

  • 谢谢,这真是个很棒的技巧,但我可以不想改变 main()
【解决方案2】:

你可以试试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());
}

【讨论】:

    猜你喜欢
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 2011-03-23
    • 2014-12-20
    • 2021-08-27
    相关资源
    最近更新 更多