杀死后的STD ::线程如何处理
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:如何跟踪资源?是否可以摧毁被杀线程的本地资源?
问题2:被杀死后的线程是否仍然可加入?JOIN((方法会立即返回吗?加入((与被杀线的好习惯吗?
问题3:由于被杀死的线程可能已经使用了全球资源,因此它可能处于无效状态。有没有办法阻止所有其他线程使用全局资源来防止进一步损害?
C 线程库是否完全与信号合作?
首先,sigterm的行为与不同版本的posix库不同。在2.6中,Sigterm将迫使线程干净地退出。但是使用2.4,线程将处于不确定状态。
现在您的第一个问题: -
问题1:如何跟踪资源?是否可以摧毁被杀线程的本地资源?
在这种情况下,您无法选择跟踪资源,并且无法再达到线程。
现在您的第二个问题: -
问题2:被杀死后的线程是否仍然可加入?JOIN((方法会立即返回吗?加入((与被杀线的好习惯吗?
简直就是您的所有问题。
现在您的第三个问题: -
问题3:由于被杀死的线程可能已经使用了全球资源,因此它可能处于无效状态。有没有办法阻止所有其他线程使用全局资源来防止进一步损害?
在这种情况下,您可以使用pthread条件变量(pthread_cond_t(。
相关文章:
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用流处理接收到的数据
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 基于多个条件处理地图中的所有元素
- 如何用数字处理log(0)
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- 错误处理.将系统错误代码映射到泛型
- 从文本文件中读取时钟时间和事件时间并进行处理
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 用于矢量处理的多个线程
- 对字符串进行排序时,在c++中处理sort()
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- 处理除以零会导致<csignal>意外行为
- 是否可以在c++中处理字符串流中的各个元素
- 在简单的外壳中进行批处理处理