thread_specific_ptr多线程混淆
thread_specific_ptr multithread confusion
//代码片段 1
static boost::thread_specific_ptr<StreamX> StreamThreadSpecificPtr;
void thread_proc() {
StreamX * stream = NULL;
stream = StreamThreadSpecificPtr.get();
if (NULL == stream) {
stream = new StreamX();
StreamThreadSpecificPtr.reset(stream);
}
printf("%pn", stream);
}
int run() {
boost::thread_group threads;
for(int i = 0; i < 5; i ++) {
threads.create_thread(&thread_proc);
}
threads.join_all();
}
// the result is
0x50d560 -- SAME POINTER
0x50d540
0x50bfc0
0x50bef0
0x50d560 -- SAME POINTER
代码片段 2
static boost::thread_specific_ptr<StreamX> StreamThreadSpecificPtr(NULL); // DIFF from code snippet 1
void thread_proc() {
StreamX * stream = NULL;
stream = StreamThreadSpecificPtr.get();
if (NULL == stream) {
stream = new StreamX();
StreamThreadSpecificPtr.reset(stream);
}
printf("%pn", stream);
}
int run() {
boost::thread_group threads;
for(int i = 0; i < 5; i ++) {
threads.create_thread(&thread_proc);
}
threads.join_all();
}
// the result is
0x50d510
0x50d4f0
0x50bf70
0x50ca70
0x50be50
在代码段 1 中,两个指针是相同的。 这是意料之中的。在代码片段 2 中,将 StreamThreadSpecificPtr 初始化为 NULL,一切都很好。
你能帮忙找出这个困惑的答案吗?多谢。
令人高兴的是,您的线程实际上是异步终止的,从而破坏了 StreamX 实例。
使用检测器:
struct StreamX
{
StreamX() { puts(__FUNCTION__); }
~StreamX() { puts(__FUNCTION__); }
};
我得到以下输出:
StreamX
0x7f258c0008c0
~StreamX
StreamX
0x7f25740008c0
~StreamX
StreamX
0x7f25840008c0
~StreamX
StreamX
0x7f25780008c0
StreamX
~StreamX
0x7f257c0008c0
~StreamX
real 0m0.002s
user 0m0.000s
sys 0m0.004s
后续分配重用相同的堆地址是有意义的,因为不涉及太多碎片。换句话说,您不能只比较指针以查看它们是否在并发应用程序中为同一对象设置别名。
与第二个示例的区别只是虚假的。有许多因素可以 - 并且将 - 影响结果。例如,在每个线程的末尾添加一个微小的延迟将消除线程在其他实例实例化之前终止的所有机会。
在科里鲁现场观看
相关文章:
- 在C++中使用cURL和多线程
- 多线程双缓冲区
- 为什么我的多线程作业队列崩溃
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 为什么一个向量上的多线程操作很慢
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 全局变量 多读取器 一个写入器多线程安全?
- boost::文件系统::recursive_directory_iterator多线程安全
- 如何阻止TensorFlow的多线程
- 如何在多线程中正确使用unique_ptr进行多态性?
- 并发/多线程:是否可以以这种方式生成相同的输出?
- sigwait() 在多线程程序中不起作用
- 多线程程序中出现意外的内存泄漏
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 多线程比没有线程C++慢
- 具有 C++11 多线程的特征库
- 通过安装信号处理程序关闭多线程应用程序
- 成员变量在多线程 C++ 时自行更改
- 尝试从头开始实现Leetcode的FizzBuzz多线程问题。收到"libc++abi.dylib: terminating"错误