В новой версии C++ 2011 уже довольно много вкусностей и первая с которой я предлагаю ознакомиться — потоки (threads).
Это уже не техника будущего, данные возможности уже имеются на вашем компьютере (скорее всего). По крайней мере в моей ubuntu c GCC 4.8 этот код компилируется и работает без проблем.
Раньше я писал о потоках. Потоки в новой версии С++ меня обрадовали своей простотой и элегантностью.
Для того чтобы создать поток, вам понадобиться написать 2 строки кода, причем одна из них include 😉
Давайте напишем программу, которая создаст 3 потока, а затем заставит главную программу подождать 2сек.
Инклудим:
#include <thread> #include <iostream>
Функция, которую мы будем выполнять в потоке выглядит вот так:
void hello(){ std::cout << "Привет, я поток " << std::this_thread::get_id() << std::endl; }
Никаких особых требований к данной функции не предъявляеться
int main(){ // создаем потоки std::thread t1(hello); std::thread t2(hello); std::thread t3(hello); t1.join(); t2.join(); t3.join(); std::cout << "Ожидание 2000 ms\n"; std::chrono::milliseconds w( 2000 ); std::this_thread::sleep_for( w ); std::cout << "Конец.\n"; return 0; }
Вывод программы может отличаться в зависимости от того, с какой скоростью выполниться какой-либо поток.
В идеальном случае:
$ ./thread Привет, я поток 140589401282304 Привет, я поток 140589392889600 Привет, я поток 140589384496896 Ожидание 2000 ms
Компилировать нужно так:
g++ -o thread -std=c++11 -pthread -Wl,--no-as-needed thread.cpp
Вы также можете создать функцию с параметрами для выполнения в потоке таким образом:
void threadFunction(int i, double d, const std::string &s) { std::cout << i << ", " << d << ", " << s << std::endl; } int main() { std::thread thr(threadFunction, 1, 2.34, "example"); thr.join(); return 0; }
Вывод этой программы такой:
$ ./thread 1, 2.34, example
Работа с потоками существенно упростилась и стала похожей на работу в языках высокого уровня. Теперь для создания потока нужно всего пару строк кода.