среда, 21 декабря 2011 г.

Документация на boost thread на русском


Документации на boost по-русски днем с огнем не отыскать, вот я и решил внести свой вклад. Начну с того что я использую постоянно, библиотеку boost::thread.

Обзор

Boost.Thread позволяет использовать несколько потоков исполнения с общими данными в кроссплатформенном C++ коде. Библиотека предоставляет классы и функции, как для управления самими потоками и синхронизации данных, так и для обеспечения раздельных копий данных для отдельных потоков.



Библиотека Boost.Thread изначально была разработана Уильям Э. Кемпф(William E. Kempf). Данная версия была переписана для совместимости со стандартами C++ в частях  N2497N2320N2184N2139, и 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.
Количество дополнительных аргументов неограниченно.

На данный момент все, в будущем возможно буду обновлять пост

Комментариев нет:

Отправить комментарий