C++11 随机数生成器的线程安全

2024-02-12

C++11 中有许多新的随机数生成器引擎和分布函数。它们线程安全吗?如果您在多个线程之间共享单个随机分布和引擎,是否安全并且您仍然会收到随机数吗?我正在寻找的场景是这样的,

void foo() {
    std::mt19937_64 engine(static_cast<uint64_t> (system_clock::to_time_t(system_clock::now())));
    std::uniform_real_distribution<double> zeroToOne(0.0, 1.0);
#pragma omp parallel for
    for (int i = 0; i < 1000; i++) {
        double a = zeroToOne(engine);
    }
}

使用 OpenMP 或

void foo() {
    std::mt19937_64 engine(static_cast<uint64_t> (system_clock::to_time_t(system_clock::now())));
    std::uniform_real_distribution<double> zeroToOne(0.0, 1.0);
    dispatch_apply(1000, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(size_t i) {
        double a = zeroToOne(engine);
    });
}

使用 libdispatch。


C++11 标准库基本上是线程安全的。 PRNG 对象上的线程安全保证与容器上的相同。更具体地说,由于 PRNG 类都是pseudo-随机,即它们根据确定的当前状态生成确定性序列,实际上没有空间可以窥视或戳探所包含状态之外的任何内容(用户也可以看到)。

正如容器需要锁才能安全共享一样,您也必须锁定 PRNG 对象。这会使其变得缓慢且不确定。每个线程一个对象会更好。

§17.6.5.9 [数据种族解析]:

1 本节规定了实施应满足的要求 防止数据争用 (1.10)。每个标准库函数应 除非另有说明,否则满足每项要求。实施可能会 防止以下指定情况以外的情况下的数据争用。

2 C++标准库函数不得直接或间接 访问当前线程以外的线程可访问的对象 (1.10) 线程,除非对象是通过直接或间接访问的 函数的参数,包括 this。

3 C++标准库函数不得直接或间接 修改当前线程以外的线程可访问的对象(1.10) 线程,除非对象是通过直接或间接访问的 函数的非常量参数,包括 this。

4 [ 注意:这意味着,例如,实现不能使用 用于内部目的的静态对象无需同步,因为它 即使在未明确共享的程序中也可能导致数据竞争 线程之间的对象。 ——尾注]

5 C++ 标准库函数不得间接访问对象 通过其参数或通过其容器的元素可访问 参数,除非调用其规范所需的函数 在那些容器元素上。

6 对调用标准库获得的迭代器的操作 容器或字符串成员函数可以访问底层 容器,但不得对其进行修改。 [注:特别是容器 使迭代器无效的操作与以下操作冲突 与该容器关联的迭代器。 ——尾注]

7 实现可以在线程之间共享它们自己的内部对象 如果对象对用户不可见并且受到数据保护 比赛。

8 除非另有说明,C++ 标准库函数应 仅在当前线程内执行所有操作,如果 操作具有用户可见的效果 (1.10)。

9 [注意:这允许实现并行化操作,如果 没有明显的副作用。 ——尾注]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++11 随机数生成器的线程安全 的相关文章

  • 如何捕获未发送到 stdout 的命令行文本?

    我在项目中使用 LAME 命令行 mp3 编码器 我希望能够看到某人正在使用什么版本 如果我只执行 LAME exe 而不带参数 我会得到 例如 C LAME gt LAME exe LAME 32 bits version 3 98 2
  • 代码 GetAsyncKeyState(VK_SHIFT) & 0x8000 中的这些数字是什么?它们是必不可少的吗?

    我试图在按下按键的简单动作中找到这些数字及其含义的任何逻辑解释 GetAsyncKeyState VK SHIFT 0x8000 可以使用哪些其他值来代替0x8000它们与按键有什么关系 GetAsyncKeyState 根据文档返回 如果
  • 为什么pow函数比简单运算慢?

    从我的一个朋友那里 我听说 pow 函数比简单地将底数乘以它的指数的等价函数要慢 例如 据他介绍 include
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • 如何使用 Castle Windsor 将对象注入到 WCF IErrorHandler 实现中?

    我正在使用 WCF 开发一组服务 该应用程序正在使用 Castle Windsor 进行依赖注入 我添加了一个IErrorHandler通过属性添加到服务的实现 到目前为止一切正常 这IErrorHandler对象 一个名为FaultHan
  • 为什么在 WebApi 上下文中在 using 块中使用 HttpClient 是错误的?

    那么 问题是为什么在 using 块中使用 HttpClient 是错误的 但在 WebApi 上下文中呢 我一直在读这篇文章不要阻止异步代码 https blog stephencleary com 2012 07 dont block
  • 查看 NuGet 包依赖关系层次结构

    有没有一种方法 文本或图形 来查看 NuGet 包之间的依赖关系层次结构 如果您使用的是新的 csproj 您可以在此处获取所有依赖项 在项目构建后 项目目录 obj project assets json
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • 从客户端访问 DomainService 中的自定义对象

    我正在使用域服务从 Silverlight 客户端的数据库中获取数据 在DomainService1 cs中 我添加了以下内容 EnableClientAccess public class Product public int produ
  • unordered_map 中字符串的 C++ 哈希函数

    看起来 C 标准库中没有字符串的哈希函数 这是真的 在任何 c 编译器上使用字符串作为 unordered map 中的键的工作示例是什么 C STL提供模板专业化 http en cppreference com w cpp string
  • 对 std::vector 进行排序但忽略某个数字

    我有一个std vector
  • File.AppendText 尝试写入错误的位置

    我有一个 C 控制台应用程序 它作为 Windows 任务计划程序中的计划任务运行 此控制台应用程序写入日志文件 该日志文件在调试模式下运行时会创建并写入应用程序文件夹本身内的文件 但是 当它在任务计划程序中运行时 它会抛出一个错误 指出访
  • 为什么可以通过ref参数修改readonly字段?

    考虑 class Foo private readonly string value public Foo Bar ref value private void Bar ref string value value hello world
  • 打破 ReadFile() 阻塞 - 命名管道 (Windows API)

    为了简化 这是一种命名管道服务器正在等待命名管道客户端写入管道的情况 使用 WriteFile 阻塞的 Windows API 是 ReadFile 服务器已创建启用阻塞的同步管道 无重叠 I O 客户端已连接 现在服务器正在等待一些数据
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • 打印大型 WPF 用户控件

    我有一个巨大的数据 我想使用 WPF 打印 我发现WPF提供了一个PrintDialog PrintVisual用于打印派生的任何 WPF 控件的方法Visual class PrintVisual只会打印一页 因此我需要缩放控件以适合页面
  • WebBrowser.Print() 等待完成。 。网

    我在 VB NET 中使用 WebBrowser 控件并调用 Print 方法 我正在使用 PDF 打印机进行打印 当调用 Print 时 它不会立即启动 它会等到完成整个子或块的运行代码 我需要确保我正在打印的文件也完整并继续处理该文件
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体

随机推荐

  • SQL Server 2005 和 SQL Server 2012 中选择查询的默认排序顺序

    SQL Server 2005 和 SQL Server 2012 中选择查询的默认排序顺序有区别吗 我有一个没有主键的表变量 当我在 SQL Server 2005 中对表变量执行选择查询时 将选择记录并根据其中一列按字母顺序显示 在 S
  • 如何将粘性 div 保持在固定标题下方

    我在我的项目中使用 Bootstrap 4 并且在固定导航栏下保留带有 sticky top 类的 div 似乎遇到问题 我尝试过使用 javascript 来替换滚动上的 css 但这似乎不起作用 我知道有一种方法可以为导航栏设置一个 i
  • 合并两个数据帧以按顺序获取每个数据帧的交替行

    我的数据框DATA is k l g 1 A 2004 12 2 B 2004 3 4 3 C 2004 4 5 另一个数据框DATA2 is i d t 1 A 2012 22 2 B 2012 4 8 3 C 2012 5 6 我想要得
  • 学习 UIScrollView 的基础知识

    我一直很难找到 UIScrollView 的好例子 即使是苹果的 UIScrollView Suite 我也觉得有点缺乏 我正在寻找一个教程或示例集 向我展示如何创建类似于 iPhone Safari 选项卡滚动的内容 当您从一个浏览器窗口
  • 相同域,不同文件夹 PHP 会话

    我想根据用户所在的文件夹设置不同的会话 ID 例如 我有域名https example com https example com其中有文件夹 app1 app2 等 每个应用程序文件夹内有多个文件 我想设置一个会话 ID 用于 app1
  • 找不到“算法”文件

    我正在尝试使用以下库在 Xcode 中创建一个简单的控制台应用程序 https github com marstone ingress ios tree master s2 geometry https github com marston
  • 使用格式规范迷你语言截断和填充

    我目前正在编写使用 Python 的代码 用空格填充字符串格式规范迷你语言 http docs python org 2 library string html formatspec print user lt 10 you re welc
  • 在其消费者中处理生成器异常

    这是后续处理生成器中抛出的异常 https stackoverflow com q 11366064 989121并讨论一个更普遍的问题 我有一个读取不同格式数据的函数 所有格式都是面向行或记录的 并且对于每种格式都有一个专用的解析函数 作
  • 创建zip时没有错误,但没有创建

    我编写此代码是为了创建一个 ZIP 文件并保存它 但不知怎的 它只是没有显示任何错误 但它也没有创建 ZIP 文件 这是代码 zip new ZipArchive time microtime true res zip gt open ma
  • 使用 hibernate 将 null 保存为 id [重复]

    这个问题在这里已经有答案了 我处于一个奇怪的位置 我需要保存 Id of an Entity as null 整个项目是使用 hibernate 和实体构建的 但对于这一遗留实体 表本身有一个触发器来生成 ID 因此 尝试插入除 null
  • 不使用 MFMailComposeViewController 发送电子邮件

    是否可以在iOS中发送电子邮件而不依赖于系统默认的邮件 消息传递接口 这与消息传递真的一样吗 您不能为消息创建自定义界面 而是使用 MFMessageComposerViewController 的默认界面 看看这个答案 锁定 MFMail
  • 如何读取 PHP 中的请求标头?

    我应该如何读取 PHP 中的任何标头 例如自定义标头 X Requested With IF 你只需要一个标题 而不是allheaders 最快的方法是
  • EaselJS 在鼠标悬停时更改颜色

    在笨手笨脚地在 HTML canvas 元素中实现了所有与鼠标和矢量相关的信息后 我切换到了 EaselJS 我已经习惯了 EaselJS 它真的很简洁 我特别喜欢这些容器以及它们使绘制嵌入形状变得多么简单 但是 我不知道你如何实现颜色变化
  • 运行时间较长但易于验证的算法?

    我正在设计一个网站进行实验 会有一个按钮供用户使用must点击并按住一段时间 然后松开 然后客户端向服务器提交AJAX事件 但是 为了防止自动点击机器人和快速垃圾邮件 我希望保持时间非常真实且不可跳过 例如做一些计算 重点是浪费实际的 CP
  • 子组件的 v-model 和子组件 Vue 内部的 v-model

    有没有办法简化这段代码 该按钮还应该更改子级的 localValue Vue component my input template div b My Input b br localValue localValue br div
  • 浮动溢出?

    下面的代码似乎总是产生错误的结果 我已经在 gcc 和 windows Visual Studio 上测试了它 是因为浮动溢出还是其他原因 提前致谢 include
  • c++11 成员函数从 unique_ptr 向量返回原始指针向量

    我开始使用 c 11 功能 并且我喜欢仅使用智能指针来拥有对象 这是我的课程 class MyClass public vector
  • Maven,配置具体目标

    我想配置 maven war plugin 的 爆炸 目标
  • 显示 Flex 上的文本右对齐

    我的代码如下 div div div div list name div br div div formatTime this state remainingTime days span language days span div div
  • C++11 随机数生成器的线程安全

    C 11 中有许多新的随机数生成器引擎和分布函数 它们线程安全吗 如果您在多个线程之间共享单个随机分布和引擎 是否安全并且您仍然会收到随机数吗 我正在寻找的场景是这样的 void foo std mt19937 64 engine stat