C ++ многопоточных баз отмечает исследование (семь)

А, станд :: асинхронной и станд :: будущего использования

станд :: асинхронной шаблон функции, станд :: Будущее шаблон класса

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 }

станд :: иого значения для пакета, переданного по ссылке.



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

отwww.cnblogs.com/main404/p/11260266.html