【发布时间】: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