Потоки в C++11

Опубликовано lamazavr - пн, 11/18/2013 - 23:12
Body

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

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

Добавить комментарий

Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.