Документации на boost по-русски днем с огнем не отыскать, вот я и решил внести свой вклад. Начну с того что я использую постоянно, библиотеку boost::thread.
Обзор
Boost.Thread позволяет использовать несколько потоков исполнения с общими данными в кроссплатформенном C++ коде. Библиотека предоставляет классы и функции, как для управления самими потоками и синхронизации данных, так и для обеспечения раздельных копий данных для отдельных потоков.
Библиотека Boost.Thread изначально была разработана Уильям Э. Кемпф(William E. Kempf). Данная версия была переписана для совместимости со стандартами C++ в частях N2497, N2320, N2184, N2139, и N2094.
Для того что бы воспользоватся классами и функциями описанными тут вы можете подключать специфичные для каждого класса или функции header'ы или подключить мастер header:
#include <boost/thread.hpp>
который подключает все остальные.
Резюме
Класс
boost::thread
ответственный за запуск и управление потоками. Каждый объект b::t представляет один поток выполнения, или Not-a-Thread и только один объект
boost::thread может представлять один поток, объекты
boost::thread не копируемые.
Объекты
boost::thread перемещаемые, так или иначе, по-этому их можно хранить в move-aware контейнерах и возвращать из функций. Это позволяет скрыть подробности создания потока.
boost::thread make_thread();
void f()
{
boost::thread some_thread=make_thread();
some_thread.join();
}
[Note: On compilers that support rvalue references,
boost::thread
provides a proper move constructor and move-assignment operator, and therefore meets the C++0xMoveConstructible and MoveAssignable concepts. With such compilers, boost::thread
can therefore be used with containers that support those concepts.
For other compilers, move support is provided with a move emulation layer, so containers must explicitly detect that move emulation layer. See <boost/thread/detail/move.hpp> for details.]
Запуск потоков
Новый поток запускается посредством передачи вызываемого объекта, который может быть вызван без параметров, в конструктор класса. Далее объект копируется во внутреннее хранилище и вызывается в новом потоке.Если же объект не может(не должен) копироваться, стоит воспользоваться Boost::ref для создания указателя на него. В этом случае программист должен проследить за тем что бы объект на который ссылается указатель не был уничтожен раньше чем поток.
struct callable
{
void operator()();
};
boost::thread copies_are_safe()
{
callable x;
return boost::thread(x);
} // правильно! x уничтожен, но созданный поток имеет копию
boost::thread oops()
{
callable x;
return boost::thread(boost::ref(x));
} //неправильно! x уничтожен, созданный поток имеет указатель на x
Если нужно создать экземпляр
boost::thread на основе функции или вызываемого объекта, которому требуется аргументы, то следует добавить эти аргументы как дополнительные параметры конструктора boost::thread
void find_the_question(int the_answer);
boost::thread deep_thought_2(find_the_question,42);
Аргументы копируются во внутреннее хранилище, если требуется передать указатель воспользуйтесь boost::ref.
Количество дополнительных аргументов неограниченно.
Комментариев нет:
Отправить комментарий