А, станд :: асинхронной и станд :: будущего использования
станд :: асинхронной шаблон функции, станд :: Будущее шаблон класса
1 #include <iostream> 2 #include <нить> 3 #include <будущее> 4 #include <windows.h> 5 6 с использованием пространства имен STD; 7 8 INT MyThread () 9 { 10 соиЬ << " моя нить: " << станд :: this_thread :: get_id () << " начать " << епсИ; 11 INT Темп = 0 ; 12 Темп ++ ; 13 сна ( 5000 ); " Моя нить: " << станд :: this_thread :: get_id () << " конец " << епсИ; 15 возвращения температуры; 16 } 17 INT основных () 18 { 19 соиЬ << " основной поток: " << станд :: this_thread :: get_id () << " начать " << епсИ; 20 станд :: будущее < INT > результат = станд :: асинхронной (станд :: запуск :: асинхронной, MyThread); 21 // станд :: асинхронной (MyThread);相当于станд :: асинхронной (станд :: запуск :: асинхронной, MyThread); Автоматически создать поток , чтобы начать выполнение функции ввода нити и возвращает зЬй :: будущих объектов к результату 23 24- соиЬ << Результата. GET () << епсИ; // ждешь функции входа выполняются, пока я не получил возвращаемое значение, а именно TEMP 25 // result.wait (); // только ждет функции ввода , выполняемой, но не возвращает результаты 26 COUT << " Основная тема: " << this_thread :: :: get_id STD () << " Конец " << епсИ; 27 System ( " PAUSE " ); 28 возвращения 0 ; 29 }
станд :: асинхронных (станд :: запуск :: асинхронной, MyThread); если станд :: асинхронные () Первый параметр в станд :: Lauch :: отложен, то поток не будет выполняться немедленно, но задержать нить функция ввода станда :: будущее ожидания () или вызов функции получить () , если вы выполняете. На самом деле, это не создает
дочерний поток, а просто вызовите функцию ввода в основной функции.
Два, станд :: Использование packaged_task
станд :: packaged_task шаблон класса, параметры шаблона можно назвать все виды объектов, с помощью которых различной вызываемой упакованы, легко функция входа как нить позвонить
1 #include <iostream> 2 #include <нить> 3 #include <будущее> 4 #include <windows.h> 5 6 с использованием пространства имен STD; 7 8 INT весело ( INT вал) 9 { 10 соиЬ << " моя нить: " << станд :: this_thread :: get_id () << " начать " << епсИ; 11 Вэл ++ ; 12 соиЬ << " моя нить: " << станд :: this_thread ::" << епсИ; 13 возврата вал; 14 } 15 INT основных () 16 { 17 соиЬ << " основной поток: " << станд :: this_thread :: get_id () << " начать " << Endl; 18 зЬй: : packaged_task < INT ( ИНТ )> упаковка (весело); 19 поток t1 (станд :: исх (пакет), 0 ); 20 t1.join (); 21 станд :: будущее < INT > результат = pack.get_future () ; 22 соиЬ << результат. получить () << Endl; 23 соиЬ << " Основной поток: " << станд :: this_thread :: get_id () << " конец " << епсИ; 24 система ( " пауза " ); 25 возвращения 0 ; 26 }
Три, станд :: обещание использования
станд :: Обещание шаблон класса может быть возложены на него в потоке, то в другом потоке, в какой-то момент в будущем, это значение может быть вынут.
1 #include <iostream> 2 #include <нить> 3 #include <будущее> 4 #include <windows.h> 5 6 с использованием пространства имен STD; 7 8 недействительным MyThread1 (станд :: обещание < INT > и про, ИНТ вал) 9 { 10 соиЬ << " мой thread1: " << станд :: this_thread :: get_id () << " начать " << епсИ; 11 Вэл ++ ; 12 val-- ; ); // 假设运算了500毫秒 14 INT результат = Val; 15 pro.set_value (вал); // 保存结果 16 соиЬ << " мой thread1: " << станд :: this_thread :: get_id () << " конец " << епсИ; 17 } 18 19 20 недействительным MyThread2 (станд :: будущее < ИНТ > & getful) 21 { 22 соиЬ << " мой thread2: " << станд :: this_thread :: get_id () << "епсИ; 23 авто GETVAL = getful. получить (); 24 соиЬ << GETVAL << епсИ; 25 соиЬ << " мой thread2: " << станд :: this_thread :: get_id () << " конец " << епсИ; 26 } 27 INT основных () 28 { 29 соиЬ << " основной поток: " << станд :: this_thread :: get_id () << " начать " << епсИ; 30 станд :: обещание < INT > пром; //Объявляет тип объекта обещания сохраненного Int 31 для резьбы Т1 (MyThread1, STD :: REF (ППЗ), 10 ); 32 t1.join (); 33 34 STD :: Будущего < INT > prom.get_future FUL = (); // Promise и будущее привязки, для возвращения сохраненных результатов 35 36 // Получить результаты в главном потоке 37 [ @ Авто ful.get результат = (); // GET () только один раз, если основной поток используется а, t2 становятся непригодными для использования 38 // результат COUT << << епсИ; 39 40 // Получить t2, результаты в потоке 41 является поток t2 (MyThread2, STD :: REF (FUL)); 42 t2.join (); 43 44 соиЬ << " Основной поток: " << станд :: this_thread :: get_id () << " конец " << епсИ; 45 система ( " пауза " ); 46 возвращения 0 ; 47 }
станд :: иого значения для пакета, переданного по ссылке.