std::call_once 是无锁的吗?

2024-02-07

我想知道 std::call_once 锁是否已释放。There https://codereview.stackexchange.com/questions/117468/stdonce-flag-and-stdcall-once-implementation是使用互斥锁的 call_once 实现。但是我们为什么要使用互斥体呢?我尝试使用atomic_bool和CAS操作编写简单的实现。代码线程安全吗?

#include <iostream>
#include <thread>
#include <atomic>
#include <unistd.h>

using namespace std;
using my_once_flag = atomic<bool>;

void my_call_once(my_once_flag& flag, std::function<void()> foo) {
    bool expected = false;
    bool res = flag.compare_exchange_strong(expected, true,
                                            std::memory_order_release, std::memory_order_relaxed);
    if(res)
        foo();
}
my_once_flag flag;
void printOnce() {
    usleep(100);
    my_call_once(flag, [](){
       cout << "test" << endl;
    });
}

int main() {
    for(int i = 0; i< 500; ++i){
            thread([](){
                printOnce();
            }).detach();
    }
    return 0;
} 

您建议的实现不是线程安全的。它确实保证了foo()只会通过此代码调用一次,但它不能保证所有线程都会看到调用的副作用foo()。假设线程 1 执行比较并得到 true,则调度程序在线程 2 调用之前切换到线程 2foo()。线程 2 将返回 false,跳过对foo(),然后继续。自从拨打电话以来foo()尚未执行,线程 2 可以在产生任何副作用之前继续执行foo()已经发生。

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

std::call_once 是无锁的吗? 的相关文章

  • 在 DataGridView 中隐藏行非常慢

    我在 Winforms 应用程序中有一个 DataGridView 大约有 1000 行 未绑定 和 50 列 隐藏一列需要整整 2 秒 当我想隐藏大约一半的行时 这就成为一个问题 private void ShowRows string
  • 将 Python 控制台集成到 GUI C++ 应用程序中

    I m going to add a python console widget into a C GUI below some other controls 许多类将暴露给 python 代码 包括一些对 GUI 的访问 也许我会考虑 P
  • 在 C# 中调用事件处理程序

    我一直在尝试学习如何在 C 中使用事件处理程序 但我无法弄清楚 handler this e 在以下代码中的作用 public event EventHandler ThresholdReached protected virtual vo
  • 在不使用 ncurses 的情况下用 C/C++ 编写“真正的”交互式终端程序,例如 vim、htop...

    不 我不想使用ncurses 因为我想了解如何 终端可以工作 并且我自己编程也很有趣 没有 必须是可移植的 它必须只能在基于 linux xterm 的终端仿真器上工作 我想做的是编写一个交互式终端应用程序 例如 htop 和 vim 我的
  • 使用 size_t 值反向遍历向量

    我想以相反的方向遍历向量的值 如您所知 向量的大小为 size t 当我使用以下代码时 for size t r m size 1 r gt 0 r x r f r for size t c r 1 c lt m size c x r m
  • 求一个数的因数。无法得到准确的结果

    有人可以帮助纠正我的算法吗 我已经对几个数字进行了测试 但它没有输出完整的因式分解 对于具有大量因子的数字 它完全失败 int num 20 for int i 2 i lt num i if num i 0 cout lt lt i lt
  • WinForms - 表单大小错误

    我们有以下代码 private void MainForm Shown object sender EventArgs e RepositionForm private void RepositionForm Rectangle rect
  • 是否有一种算法可以在线性时间内计算数组反转?

    我知道有多少倒转 en wikipedia org wiki Inversion 28discrete mathematics 29 in an n 元素数组可以在 O n log n 操作使用增强型归并排序 http www geeksf
  • 将一个整数从 C 客户端发送到 Java 服务器

    我使用此代码将一个整数从我的 Java 客户端发送到我的 Java 服务器 int n rand nextInt 50 1 DataOutputStream dos new DataOutputStream socket getOutput
  • 使用宏计算源文件行数?

    是否可以使用 C C 预处理器将源文件中的行数计算为宏或某种编译时可用值 例如 我可以更换吗MAGIC1 MAGIC2 and MAGIC3在下面 并在使用时以某种方式获取值 4MAGIC3 MAGIC1 can be placed whe
  • TreeView:仅在子节点中存在复选框

    我需要一个树视图控件 根节点没有复选框 只有图像 所有子节点都有一个复选框 图像 C net 2 0 winforms 不是 wpf WinForms树视图默认不支持混合复选框 非复选框节点 您可以在树视图上全局启用复选框 并使用以下命令在
  • EWS - 给予预约,获取预约的所有者副本

    在 EWS 中进行预约后 是否可以获得所有者的副本 例如 如果我登录为user1 我有user1创建的约会的副本user2 我有冒充权 我要编辑user2预约的副本 我怎样才能获得user2 s copy 您可以使用 PidLidClean
  • 参数数量在编译时确定的 Lambda 函数

    我想声明一个带有 N 个参数的 lambda 函数 其中 N 是模板参数 就像是 template
  • 未找到 _sqlite3_open 等符号错误

    您好 我收到此错误 Undefined symbols sqlite3 open referenced from main in ccRlWVer o sqliite3 close referenced from main in ccRlW
  • 为什么调试器只显示数组指针中的一个元素?

    首先 我知道new是执行此操作的 C 方法 我只是表明有不止一种方法可以重现此错误 而且两种方法都令人难以置信的令人沮丧 我有两种形式的源文件 我正在尝试调试另一个编程作业 但我并没有寻求帮助 基本上 我正在尝试重新实施set作为一个类 具
  • 如何在给定点停止线程?

    我试图停止一些线程 阅读一些有关优雅地执行此操作的正确方法的内容 但我一定做错了什么 因为它根本不起作用 起初我尝试不使用lock with IsRunning不稳定 然后尝试使用锁 这是我所拥有的 private volatile boo
  • 扔掉挥发物安全吗?

    大多数时候 我都是这样做的 class a public a i 100 OK delete int j Compiler happy But is it safe The following code will lead compilat
  • 从 STL 列表中删除项目

    我想创建一个函数 如果符合特定条件 则将项目从一个 STL 列表移动到另一个列表 这段代码不是这样做的方法 迭代器很可能会被擦除 函数失效并导致问题 for std list
  • 如何在没有 Visual Studio 的情况下将新文件添加到 .csproj 文件

    如何添加新文件到 csproj从命令提示符 我认为没有任何工具可以响应命令行上的 add project 命令来执行此操作 但我认为您可以幸运地创建一个程序 脚本来直接操作 csproj 文件的 XML 内容 csproj 文件的结构如下所
  • C# amo 获取角色完整

    我正在开发一个 SSAS 项目 其中除其他事项外 我需要获取 C 中表格多维数据集的完整用户列表 目前我让它以这样的方式工作 我可以获得角色 但数据不完整 当我调用 Server Database Roles 为了便于阅读而简化 属性并枚举

随机推荐

  • SQL Server 事务表是否应该始终具有代理主键

    对于已经有主键 4列的自然组合键 的大型事务表 1亿行 20GB 添加标识列并将其作为主键是否有助于性能 当前主键 4 列的自然复合主键 可以完成这项工作 但我被告知您应该始终有一个代理键 那么 可以通过创建标识列并将其设为主键来提高性能吗
  • 在一台机器上运行多个版本的.net

    我对 net 的各个版本很好奇 我们有一个开发各种版本 1 1 和 2 0 应用程序的环境 现在 我正在尝试在 3 5 中进行开发 最大的问题是这些版本是否能够在同一 IIS 安装上很好地协同工作 另一个需要注意的是 我正在使用 Visua
  • 如何存根仍然需要从 RSpec 中的数据库加载的对象?

    我想检查一个对象的关联是否收到某个方法调用 问题是我可以存根对象的关联 但是当稍后从数据库加载关联时 加载的对象与我的存根对象不是同一个 物理 对象 它具有相同的 ID 但它不是相同的 物理 对象 因此存根不再起作用 我目前拥有的是 并且这
  • C 中“tail -f”功能的自定义实现

    EDIT 我最后使用了inotify 正如 stefanB 所说 inotify 是最适合使用的东西 我发现了一个尾部克隆 它使用inotify来实现 f模式 inotail http distanz ch inotail 问题原文 我正在
  • 如何下载 Cassini 网络服务器源代码?

    如何下载 Cassini 网络服务器源代码 MSDN 说它可以在http www asp net Projects Cassini Download http www asp net Projects Cassini Download 但这
  • 房间多表同一个对象(多语言数据库)

    我正在开发一个 android 项目 该项目必须在本地数据库 房间 中存储一些数据 我必须提供的功能之一是以不同语言将数据存储在本地数据库中 例如 如果我有食物信息 则该信息必须以英语 德语 法语等存储 我的数据库的结构是这样的 Entit
  • 将父范围值传递到 Angular 中的 ng-repeat 循环中

    这应该是一个非常简单的问题 但我发现的所有解决方法都很复杂 我在模板中使用 ng repeat 循环遍历对象数组 如下所示 div class row fluid message subject campaign name div 由于 n
  • CakePHP 与 Google 的 OAuth

    我想在我的 cakePHP 应用程序中使用 Google OAuth 让用户使用他们的 google 帐户登录 我查看了以下组件 http code 42dh com oauth http code 42dh com oauth 不知怎的
  • 适用于 Android 的 VoIP 库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我需要在我的 Android 应用程序中集成 VoIP 服务 有没有免费的 最好的开源 库 我需要图书馆至少允许通过互联网进行语音通话 而
  • 重写 Android 方法时,Eclipse 插入 arg0、arg1 等而不是正确的参数名称

    当我在 Eclipse 中重写 Android 类的方法时 我得到无用的参数名称 如 arg0 arg1 等 例如 当重写来自SQLiteOpenHelper I get Override public void onCreate SQLi
  • 如何防止浏览器标题中出现 blob + guid

    基本上 我正在做的是在服务器上生成一个 PDF 文件并通过 javascript 在浏览器中显示它 如下所示 file new window Blob data type application pdf var fileUrl URL cr
  • Safari 添加尾部斜杠

    我有一个 ASP NET 网站 它使用 URLRewrite 2 删除 URL 中的尾部斜杠 我们注意到 Mac 上的 Safari 不遵守此规则 它始终在 URL 中留下尾部斜杠 SEO Moz 显示两个 URL 这似乎是潜在的重复内容问
  • 为什么不再有 PECL 扩展(例如 pecl_http)的 Windows 二进制文件?

    我正在开发一个在 Windows 上运行的 PHP 项目 能够使用 pecl http 而不是使用 cURL 并重新发明轮子来完成 pecl 扩展所做的所有很酷的事情 例如解析标头 会非常方便等等 我在所有地方 包括 PHP 站点 都读到
  • Kafka简单消费者间歇性丢失消息

    我有一个 Kafka 应用程序 我一直在其中使用 kafka console consumer sh 消费消息 如下所示 kafka console consumer sh zookeeper zookeeperhost 2181 topi
  • Scikit 学习如何打印混淆矩阵标签?

    所以我使用 sci kit learn 对一些数据进行分类 我有 13 个不同的类值 类别来对数据进行分类 现在我已经能够使用交叉验证并打印混淆矩阵 但是 它只显示 TP 和 FP 等 没有类标签 所以我不知道哪个类是什么 下面是我的代码和
  • 如何在局域网中找到我的服务器?

    我有两个自己的 C 和 Java 应用程序 服务器和客户端 它既在一个局域网内 又可以通过指定的端口传输数据 我想让客户端可以找到服务器的IP 但怎么办呢 使用地址掩码枚举所有可能的 IP 坏主意 这会花费很多时间 可能存在某种方式 我可以
  • 在控制器中找不到名称空间内的 Ruby on Rails 模型

    我是 Rails 新手 无法解决这个问题 我有一个控制器 Admin Blog EntriesController 定义在app controllers admin blog entries controller rb 我有一个模型叫 Bl
  • 无法在 Ubuntu 22.04 操作系统上通过 vscode sftp 扩展连接到 AWS EC2 服务器

    我曾经连接 Linode 和 GCP 提供的远程服务器 并通过 Sftp 扩展使用 Visual Studio Code 一切正常 但是 使用相同的配置集 我无法连接到我的 Aws EC2 服务器 以下是sftp json 敏感信息已更改
  • 如何将多个属性传递到 Angular.js 属性指令中?

    我有一个属性指令限制如下 restrict A 我需要传入两个属性 一个数字和一个函数 回调 使用指令在指令中访问它们attrs object 如果指令是元素指令 则受限制 E 我可以这样
  • std::call_once 是无锁的吗?

    我想知道 std call once 锁是否已释放 There https codereview stackexchange com questions 117468 stdonce flag and stdcall once implem