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 随机数生成器的线程安全 的相关文章

  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • 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