提供 undetermined-lifespan bool 在线程之间共享的最简单方法是啥?
Posted
技术标签:
【中文标题】提供 undetermined-lifespan bool 在线程之间共享的最简单方法是啥?【英文标题】:What is the easiest way to provide an undetermined-lifespan bool to share between threads?提供 undetermined-lifespan bool 在线程之间共享的最简单方法是什么? 【发布时间】:2016-08-23 09:47:49 【问题描述】:如果我想在线程之间共享一些 bool
标志,并且由于 thread1、thread2、... 可能是最后一个使用它的线程,我的生命周期不清楚,我该如何提供这样的类型?
我显然可以拥有一个带有互斥锁的shared_ptr<bool>
来同步对它的访问。但是,如果没有shared_ptr
,我只会使用atomic<bool>
,因为它可以完成这项工作。
现在,我可以使用shared_ptr<atomic<bool>>
将这两个概念结合起来吗?
如果不是,那么在线程之间共享未确定寿命bool
的最简单方法是什么?是互斥体吗?
可能有必要说我的系统中有多个作业,并且我想为每个作业提供一个共享的中止标志。如果工作已经完成,那么一些想要中止线程的线程在尝试设置标志时不应该崩溃。如果喜欢中止作业的线程没有保留标志(或 shared_ptr),那么线程应该仍然能够读取标志而不会崩溃。但是,如果不再有线程使用 bool,内存应该自然释放。
【问题讨论】:
全局std::atomic<bool>
有什么问题?您并没有真正提供足够的上下文来获得更好的答案。
@RichardCritten 我在最后添加了一个段落,给出了一个动机......简而言之:我有很多bool
s,如果没有人再使用它,应该释放内存
【参考方案1】:
一旦你创建了你的 atomic bool:
std::shared_ptr<std::atomic<bool>> flag = std::make_shared<std::atomic<bool>>(false /*or true*/);
在线程之间使用它应该没问题。 std::shared_ptr
上的引用计数和内存释放是线程安全的。
另一件可能感兴趣的事情是,如果您希望某些线程选择退出引用计数,那么您可以使用:
std::weak_ptr<std::atomic<bool>> weak_flag = flag;
...
std::shared_ptr<std::atomic<bool>> temporary_flag = weak_flag.lock();
if (temporary_flag != nullptr)
// you now have safe access to the allocated std::atomic<bool> and it cannot go out of scope while you are using it
// now let temporary_flag go out of scope to release your temporary reference count
【讨论】:
我说过引用计数和内存释放是线程安全的。也就是说,你真的很关心底层对象的线程安全,你可以通过适当地使用 shared_ptr 来正确处理这个问题。 shared_ptr 是“线程安全的”,只要您将它的副本(或通过weak_ptr 分配给副本)传递给每个线程,即不要从不同线程访问 同一个实例,请参阅@ 987654321@ 啊,我明白了。我什至不会想到只传递 shared_ptr 的引用。但是,该线程似乎说内容在任何情况下都不是线程安全的?! ***.com/questions/9127816/… 如果将 shared_ptr& 传递给每个线程,那不是线程安全的,而是为每个线程分配一个新的 shared_ptr(通过复制构造函数),那么 shared_ptr 是线程安全的,但是被共享的对象没有变化到它的线程安全级别,因此也使用 atomic以上是关于提供 undetermined-lifespan bool 在线程之间共享的最简单方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
无法为 Spring Security 提供自定义身份验证提供程序