воскресенье, 12 июня 2011 г.

boost:thread урок 1 Создание потока

Класс boost::thread представляет поток выполнения
в том смысле, в котором std::fstream представляет
файл. Конструктор по умолчанию создает экземпляр,
представляющий текущий поток выполнения. Пере-
груженный конструктор принимает функциональный
объект, вызываемый без аргументов и ничего не воз-
вращающий. Этот конструктор запускает новый поток
выполнения, который в свою очередь вызывает функ-
циональный объект.
На первый взгляд может показаться, что такой ди-
зайн менее полезен, нежели типичный подход языка C
к созданию потока, когда функции, вызываемой новым
потоком, передается указатель на void, с помощью ко-
торого передаются данные. Однако, поскольку биб-
лиотека Boost.Threads вместо указателя на функцию
использует функциональный объект, именно он и мо-
жет содержать данные, необходимые потоку. Такой
подход, в действительности, более гибок и типобезо-
пасен. Комбинируясь с функциональными библиоте-
ками, такими как Boost.Bind, этот дизайн позволяет
легко передавать вновь созданному потоку любые
объемы данных.
В настоящее время с объектом потока можно сде-
лать не слишком многое. Фактически, можно выпол-
нить только две операции. Объекты потоков можно
легко сравнить на равенство и неравенство, используя
операции == и !=, чтобы определить, относятся ли они
к одному и тому же потоку выполнения, и можно дож-
даться завершения потока, вызывая boost::thread::join.
Другие потоковые библиотеки позволяют выполнять
над потоками и другие операции (к примеру, устанав-
ливать его приоритет или даже останавливать). Однако
так как эти библиотеки не очень легко отобразить на
переносимые интерфейсы, все еще проводятся иссле-
дования, целью которых является добавление соответ-
ствующих возможностей и в Boost.Threads.
Пример 1 демонстрирует очень простой пример ис-
пользования класса boost::thread. Создается новый по-
ток, который просто выводит “Hello World” на
std::cout, а основной поток ждет его завершения.
// Пример 1
#include <boost/thread/thread.hpp>
#include <iostream>
void hello()
{
std::cout <<
"Hello world, I'm a thread!"
<< std::endl;
}
int main(int argc, char* argv[])
{
boost::thread thrd(&hello);
thrd.join();
return 0;
}

1 комментарий:

  1. А как в поток запихнуть функцию, которая находится в классе?

    ОтветитьУдалить