gpt4 book ai didi

c++ - std::call_once 是免费的吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:34:42 39 4
gpt4 key购买 nike

我想知道 std::call_once 锁是否空闲。 There是使用互斥锁的 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,然后线程 2 调用 foo()。线程 2 将得到 false,跳过对 foo() 的调用,然后继续。由于尚未执行对 foo() 的调用,线程 2 可以在 foo() 的任何副作用发生之前继续执行。

关于c++ - std::call_once 是免费的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40707149/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com