【问题标题】:What to do with std::thread after it was killed?std::thread 被杀死后该怎么办?
【发布时间】:2018-07-26 12:55:24
【问题描述】:

假设我们有一个线程程序。我们创建一些资源(即互斥体),生成执行自己初始化的线程,等待它们完成,然后销毁资源。

void run(void)
{
    some_resource global_resource;
    global_resource.create();

    vector<thread> my_threads;
    my_threads.reserve(thread_count);

    for(int i = 0; i < thread_count; i++)
        my_threads.push_back(
            thread([&global_resource](int i)
            {
                another_resource local_resource;
                local_resource.create();

                // SIGTERM can happen here:
                work_with_resources(global_resource, local_resource, i);

                local_resource.destroy();
            },
            i)
        );

    for(int i = 0; i < thread_count; i++)
        my_threads[i].join();

    global_resource.destroy();
}

现在假设其中一个线程很遗憾地在 work_with_resources() 期间收到了 SIGTERM。这意味着线程的本地资源永远不会被破坏。

问题 1:如何跟踪资源?是否可以销毁被杀死线程的本地资源?

问题2:被杀死后的线程还能加入吗? join() 方法会立即返回吗?与被杀死的线程一起加入()是一个好习惯吗?

问题3:由于被杀死的线程可能已经使用了全局资源,它可能会处于无效状态。有没有办法阻止所有其他线程使用全局资源以防止进一步损坏?

C++ 线程库是否与信号协作?

【问题讨论】:

  • 您可以处理和忽略 SIGTERM,但为什么会这样呢?您是否故意终止自己的线程?
  • I attempted this once; it was horrid。我想我(最终)决定不打扰了。
  • SIGTERM 通常会杀死一个进程,而不仅仅是它的一个线程。
  • 根据这个答案,您不能从不同的进程向单个线程发送终止信号。所以这不应该出现:unix.stackexchange.com/questions/1066/…

标签: c++ multithreading signals stdthread sigterm


【解决方案1】:

首先,SIGTERM 在不同版本的 POSIX 库中表现不同。在 2.6 中,SIGTERM 将强制线程干净地退出。但在 2.4 中,线程将处于不确定状态。

现在你的第一个问题:-

问题 1:如何跟踪资源?是否可以销毁被杀死线程的本地资源?

在这种情况下,您无法跟踪资源,并且无法再访问线程。

现在你的第二个问题:-

问题2:被杀死后的线程还能加入吗? join() 方法会立即返回吗?与被杀死的线程一起加入()是一个好习惯吗?

对你所有的问题都说不。

现在你的第三个问题:-

问题3:由于被杀死的线程可能已经使用了全局资源,它可能会处于无效状态。有没有办法阻止所有其他线程使用全局资源以防止进一步损坏?

在这种情况下,您可以使用 pthread 条件变量 (pthread_cond_t)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    相关资源
    最近更新 更多