杀死后的STD ::线程如何处理

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

本文关键字:何处理 处理 线程 STD      更新时间:2023-10-16

假设我们有一个螺纹程序。我们创建了一些资源(即静音(,产生自己的初始化,等待它们完成,然后销毁资源。

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的行为与不同版本的posix库不同。在2.6中,Sigterm将迫使线程干净地退出。但是使用2.4,线程将处于不确定状态。

现在您的第一个问题: -

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

在这种情况下,您无法选择跟踪资源,并且无法再达到线程。

现在您的第二个问题: -

问题2:被杀死后的线程是否仍然可加入?JOIN((方法会立即返回吗?加入((与被杀线的好习惯吗?

简直就是您的所有问题。

现在您的第三个问题: -

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

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