我想知道std :: call_once鎖是否可用。 There是使用互斥鎖的call_once實現。但爲什麼我們應該使用互斥鎖?我試圖用atomic_bool和CAS操作編寫簡單的實現。代碼線程安全嗎?是否爲std :: call_once lock free?
#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是否鎖定空閒以及它是否可以實現鎖定空閒。 – Fixturessd