std::thread被杀死后怎么办?

What to do with std::thread after it was killed?

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

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:如何跟踪资源?是否可以销毁被杀死线程的本地资源?

问题二:被kill掉的线程还能join吗? join() 方法会立即 return 吗? join() 与被杀死的线程是一个好习惯吗?

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

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

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

现在你的第一个问题:-

Question 1: What to do to keep track of resources? Is it possible to destroy the killed thread's local resource?

在这种情况下,您没有跟踪资源的选项,也无法再访问线程。

现在你的第二个问题:-

Question 2: Is the thread after being killed still joinable? Will the join() method return immediately? Is join()ing with the killed thread a good practice?

对你所有的问题都否定。

现在你的第三个问题:-

Question 3: Since the killed thread might have used the global resource, it may be left in invalid state. Is there a way to stop all other threads from using the global resource to prevent further damage?

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