В новой версии 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
Работа с потоками существенно упростилась и стала похожей на работу в языках высокого уровня. Теперь для создания потока нужно всего пару строк кода.
