Асинхронное программирование в C ++ 11 станда :: асинхронные и станд :: будущее

C ++ 11 обеспечивает высокого уровень абстракцию асинхронных задач , содержащихся в <будущего> файла заголовок, это позволяет легко достичь реализации задачи трудоемкой асинхронна, и получить результат , когда это необходимо. 
Я приведу несколько примеров: 
1. пакетное копирование загрузить файлы /; 
2. сложный расчет; 
3. выполнение нескольких вложенных запросов SQL, 
в реальном развитии, компьютер выполнять эти операции, необходимо определенное возвращать результаты после того, как раз, на этот раз мы должны использовать асинхронный. По сравнению непосредственно по сравнению с использованием зОго :: нитки, зОго :: асинхронными и станд :: Будущее имеет следующие преимущества: 
1.std :: Будущие объекты возвращаются асинхронные, вы можете легко ждать завершения реализации ИХ объектов и получить возвращаемое значение; 
2 . Некоторые дополнительные функции из библиотеки для достижения выгоды, такие как пулы потоков, и значительно уменьшить возникновение ненормальности. 
Мы смотрим на конкретном примере кода будущего :

#include <iostream> 
#include <будущее> 
#include <хроно> BOOL is_prime ( INT х) 
{ для ( INT I = 2 ; я <х, я ++ ) 
    { если (х% я == 0 )
             возвращают ложь ; вернуться верно ; 
    } 
} INT основной () 
{ 
    станд :: будущее < BOOL > FUT = станд :: асинхронной (is_prime, 4444444444444444443 ); 
    станд :: соиЬ << « подождите, проверка » ;


    
         

         



    станд :: хроно :: миллисекунды оболочка ( 10 );
    в то время как (fut.wait_for (диапазон) == станд :: future_status :: таймаут) 
        станд :: соиЬ << ' . ' << станд :: вровень;
        BOOL х = FUT. получить (); 
        станд :: соиЬ << " \ n4444444444444444443 " << (? х " является " : " не " ) << " простое \ п. " ;
        вернуться  0 ; 
}

 

станд :: будущее может быть использовано для получения результатов асинхронных задач, так что вы можете использовать его как простое средство синхронизации между потоками. станд :: будущее обычно создается Поставщиком, Поставщик вы можете себе поставщика асинхронных задач, настройки поставщика в общем состоянии потока, станд :: будущий объект , связанный с общим состоянием вызова ПОЛУЧИТЬ ( как правило , в другом потоке) , чтобы получить значение, если общий государственный флаг не готов, а затем вызвать зЬй :: будущего :: получить заблокируют текущие вызывающий пока провайдер не устанавливает значение общего состояния (общее состояние в это время флаг готов), станд :: будущее :: получить возвращаемое значение или исключения асинхронных задач (если происходит исключение). 
Функция асинхронной () может быть использована как нить, вы можете также запустить поток, но функция возвращает объект не будущий объект потока, так что фокус не процесс вычисления. Далее, посмотрите на перекодировках между резьбой и асинхронным Кодом:

#include <iostream> 
#include <нить> 
#include <будущее> с использованием пространства имен зЬй; INT основных ( INT ARGC, символ Const * ARGV []) { 
    нить т ([] {соиЬ << " Привет " << епсИ;}); 
    t.join (); вернуться 0 ; 
}

 

 



     

Выше код эквивалентен:

#include <iostream> 
#include <нить> 
#include <будущее> с использованием пространства имен зЬй; INT основных ( INT ARGC, символ Const * ARGV []) { 
    Auto F = асинхронной ([] {суд << " Привет " << епсИ;}); 
    f.wait (); вернуться 0 ; 
}

 


 


     

 

рекомендация

отwww.cnblogs.com/lx17746071609/p/11137198.html