提供 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 我在最后添加了一个段落,给出了一个动机......简而言之:我有很多bools,如果没有人再使用它,应该释放内存 【参考方案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 为了清楚这个评论线程:我发布了一个答案,假设 `std::shared_ptr> 不是线程安全的,但我错了,所以我删除了答案。

以上是关于提供 undetermined-lifespan bool 在线程之间共享的最简单方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用单个范围提供来提供多个范围描述

无法为 Spring Security 提供自定义身份验证提供程序

服务提供者框架模式

Spring Boot:静态内容正确提供 CSS 但不提供 JS

没有提供者的服务提供者接口

DUBBO 直连提供者方法