【发布时间】:2016-11-20 17:34:44
【问题描述】:
我想知道 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;
}
【问题讨论】:
-
这是一个关于
std::call_once的问题和一个关于审查替代实施的问题。请选择一个问题。 -
你的实现不是线程安全的,因为如果
foo()正在执行,call_once()需要等待它完成。没有无锁的方法可以做到这一点。 -
想了解std::call_once是否无锁,能否实现无锁。
标签: c++ multithreading c++11 lock-free