Присоединение к потоку зависает при использовании std :: call_once - PullRequest
0 голосов
/ 11 июля 2020

Я пытаюсь понять, почему 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

1 Ответ

1 голос
/ 11 июля 2020

Похоже, это ошибка в g cc (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66146).

Вы можете воспроизвести проблему, вставив короткий сон после построения t1 в вашем например, например

std::thread t1(caller,1);
using namespace std::chrono_literals;
std::this_thread::sleep_for(1ms);
...