Безопасно ли в будущем переходить на отдельную ветку? - PullRequest
6 голосов
/ 08 июля 2019

Является ли передача std::future отдельному экземпляру std::thread безопасной операцией? Я знаю, что внизу std::future имеет состояние в shared_ptr, которое он разделяет с std::promise. Вот пример.

int main()
{
    std::promise<void> p;
    std::thread( [f = p.get_future()]() {
        if ( f.wait_for( std::chrono::seconds( 2 ) ) == std::future_status::ready ) 
        {
            return;
        }

        std::terminate();
    } ).detach();

    // wait for some operation

    p.set_value();
}

В приведенном выше коде возможен случай ошибки, когда лямбда выполняется после выхода из основного потока. Общее состояние остается после выхода из основного потока?

Ответы [ 2 ]

2 голосов
/ 08 июля 2019

[basic.start.term] / 6 Если в обработчиках сигналов используется объект или функция стандартной библиотеки, не разрешенные до (21.10), чего не происходит до (4.7) завершения уничтожения объекты со статической продолжительностью хранения и выполнением std::atexit зарегистрированных функций (21.5), программа имеет неопределенное поведение.

Per [basic.start.main] / 5 , возвращаясь из main, вызывает std::exit, который уничтожает объекты со статической продолжительностью хранения и выполняет std::atexit зарегистрированных функций. Поэтому я считаю, что ваш пример демонстрирует неопределенное поведение.

1 голос
/ 08 июля 2019

Согласно cppreference :

В типичной реализации std :: shared_ptr содержит только два указателя:
- сохраненный указатель (возвращаемый get ());
- указатель на блок управления.
Блок управления является динамически размещаемым объектом ...

Учитывая эту информацию, я не думаю, что завершение основного потока повлияет на shared_ptr в рабочем потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...