Потоки в C++11

В новой версии 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

Работа с потоками существенно упростилась и стала похожей на работу в языках высокого уровня. Теперь для создания потока нужно всего пару строк кода.

 

Похожий код:

Фото аватара
Алексей Петров

Программист, разработчик с 5 летним опытом работы. Учусь на разработчика игр на Unity и разработчика VR&AR реальности (виртуальной реальности). Основные языки программирования: C#, C++.

Оцените автора
Бла, бла код
Добавить комментарий