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

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()方法会立即返回吗? join()与被杀死的线程一起使用是一种好习惯吗?

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

C++线程库是否与信号配合使用?

最佳答案

首先,SIGTERM对于不同版本的POSIX库的行为有所不同。在2.6中,SIGTERM将强制线程干净退出。但是使用2.4时,线程将处于不确定状态。

现在您的第一个问题:-



在这种情况下,您无法选择跟踪资源,也无法访问线程。

现在您的第二个问题:



对于您的所有问题,根本没有。

现在您的第三个问题:



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

10-04 17:22