std :: launch :: async верно ли номер отдельной нити? - PullRequest
0 голосов
/ 14 сентября 2018

Я читал abut std :: async с помощью std :: launch :: async и читал, что с этой политикой вызываемый объект будет вызываться в новом потоке.

Итак, ради теста я сделал следующее:

struct Wrapper
    {   
        void consume()
        {
             std::cout << "consume " << std::this_thread::get_id() << std::endl;
            std::for_each(arr.begin(), arr.end(), [](int val) {std::cout << val; });
        }

        bool produce()
        {
            std::cout << "produce " << std::this_thread::get_id() << std::endl;

            arr = { 1,0,3 };
            return true;
        }
    };


    int main()
    {

        std::cout << "main " << std::this_thread::get_id() << std::endl;

        Wrapper wrap;
        std::future<bool> fut = std::async(std::launch::async, &Wrapper::produce, &wrap);

        if (fut.get())
            std::async(std::launch::async, &Wrapper::consume, &wrap);

    }

Итак, исходя из этого, я буду ожидать 3 потока:

  • нить 1: основная нить
  • поток 2: первый вызов std :: async (выполнение команды fct)
  • поток 3: второй вызов std :: async (выполнение функции fct)

когда я запускаю программу, я получаю:

enter image description here

Почему два вызова std :: async имеют одинаковый идентификатор потока ??

Спасибо.

1 Ответ

0 голосов
/ 14 сентября 2018

Стандарт говорит о std::async:

Если в policy установлено launch​::​async, вызовет INVOKE(DECAY_­COPY(std​::​forward<F>(f)), DECAY_­COPY(std​::​forward<Args>(args))...) как в новом потоке выполнения [...]

Ссылка

Важной частью является " как будто в новом потоке выполнения".Реализация должна вести себя так, как будто вызываемый объект был вызван из нового потока, но на самом деле запуск нового потока не требуется.Это обеспечивает свободу действий, так что разработчик стандартной библиотеки может повторно использовать одни и те же потоки, возможно, сохраняя удобный пул потоков в режиме ожидания (шаблон threadpool ), который может быть более отзывчивым, чем создание и уничтожение угроз для каждогопозвоните по номеру std::async.Хотя теоретически реализация может также выбирать создание и удаление потоков каждый раз или делать что-либо еще, что соответствует требованиям стандарта.

...