Я пытаюсь понять, почему std::call_once
и std::once_flag
Моя программа
#include<iostream>
#include<thread>
#include<mutex>
#include<condition_variable>
using namespace std;
once_flag once;
void test(int i){
if(i==1){
cout<<"will be called again"<<endl;
throw exception();
}
cout<<"wont be called again"<<endl;
}
void caller(int i){
try{
call_once(once, test, i);
}catch(...){cout<<"caught"<<endl;}
}
int main(){
int val = 1;
thread t1(caller,1);
thread t2(caller,2);
thread t3(caller,2);
t1.join();t2.join();t3.join();
}
вывод терминала: 1 will be called again\n caught\n wont be called again\n
и это просто зависает, иногда он заканчивается, но большую часть времени он зависает, Я думаю, что это состояние гонки, но не могу понять, почему это происходит. Я нашел здесь тот же пример https://en.cppreference.com/w/cpp/thread/call_once