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