当前位置: 首页 > 知识库问答 >
问题:

需要自己的std::shared_future副本的线程,该副本引用共享状态

益稳
2023-03-14

我有一个关于斯科特·梅耶斯(Scott Meyers)写的《有效现代C》第270页的问题。

第5/6行,他写道:“唯一的微妙之处是每个反应线程都需要自己的std::shared_future副本,该副本引用共享状态,…”

我的问题是:为什么我们必须向每个线程中的每个lambda函数传递一份std::shared_future?然而,根据先验知识,我认为通过引用传递它没有任何问题,比如存在一个唯一的共享状态,不同的线程会使用它?

我写了一个代码,改编自斯科特·迈耶斯博士的书,即使我通过了标准参考,它也是有效的。

因此,是否有可能通过引用来传递它?

#include <future>
#include <vector>

std::promise<void> p;

void react(){}

void detect()
{
    auto sf = p.get_future().share();

    std::vector<std::thread> vt;
    int n=10;
    for(int i=0;i < n; i++)
    {
        vt.emplace_back([sf]{sf.wait();
        react();
                        });
    }

p.set_value();

for(auto& t : vt)
    t.join();


}

int main()
{
    detect();
    return 0;
}

共有1个答案

汪胤
2023-03-14

如果引用传递,多个线程正在访问shared_future的同一个实例。这可能会导致数据竞争,并且是未定义的行为。如果多个线程通过自己的shared_future副本访问共享状态,库会确保它们是同步的。

get上的参考页面显示:

它有效地调用wait(),以等待结果。

等待上的cp首选项页面说:

从多个线程调用相同的std::shared_future是不安全的;预期的用途是每个在相同共享状态下等待的线程都有一个std::shared_future的副本。

 类似资料:
  • 我需要在我的Jhipster应用程序(4.8.2)的多个站点中共享一个组件,我已经将我的组件添加到文件:: 看起来一切都很顺利,但是那个组件内的NgModel指令已经停止工作了。 如果它是value,我不带指令它读起来很好,问题是当我在带有NgModel指令的“input”中使用它时 有人能帮我解决这个问题吗? 谢谢.

  • 问题内容: 我正在编写一个多线程Java程序,其中每个线程可能都需要将其标准输出重定向到一个单独的文件。每个线程都有其自己的文件。是否可以在“每个线程”的基础上重定向System.out或在所有线程上全局更改System.out? 问题答案: 是否可以基于“每线程”重定向System.out 不,这是不可能的。 是静态的,并且在JVM最初启动时,每个JVM都会作为系统类加载器的一部分进行加载。尽管

  • ES6标准的一个新特性是Map类,用于创建数据的键:值集合。好,对。但是,为什么Javascript需要这样一个类呢?JS对象表示法实际上也是数据的键:值集合,这还不够吗?那么,有什么区别呢?

  • 我有一个django项目与PostgreS数据库。我需要在docker容器中使用我的本地数据库。如何与docker容器共享机器的localhost?My Docker-compose.yml: Django Settings.py: 我添加了 现在我有一个错误: 谁能帮我?求求你!

  • 阅读Java8的并行流API:https://docs.oracle.com/javase/tutorial/collections/streams/parallelism.html 还不清楚在使用这个流式API的并行性时,如何调优要使用的线程数? 计划在一个非常特定的机器类型和一致的数据类型上运行它,所以我想我可以在一组不同的设置上对它进行基准测试,然后使用最佳数量的线程。

  • 如何选择要使用的id文档: 这里,我创建了一个随机id文档,但我想选择一个(我指的是收集任务中文档的id)