Используя потоки Boost 1.43, можно скомпилировать следующее:
void MyClass::threadFn(...) { ... }
void MyClass::doFn(...) {
...
boost::thread(&MyClass::threadFn, this, ...);
}
Но следующее не компилируется:
void MyClass:doFn(...) {
...
struct MyStruct {
MyStruct(...) { ... };
}
boost::thread(&MyStruct, ...);
}
Это дает 'MyClass::doFn::MyStruct': illegal use of this type as an expression
, Обратите внимание, что я не пытаюсь передать указатель на экземпляр MyStruct
; Я пытаюсь передать сам тип, как я бы указатель функции, так что boost::thread
вызовет конструктор типа.
В соответствии с Boost 1.43 Threads Spec:
Новый поток запускается путем передачи объекта вызываемого типа
Так как мне передать адрес struct
введите в boost::thread
функция (AFAIK это также относится к boost::bind
)?
MyStruct не является вызываемым типом. Вам нужно определить функцию, которая работает с MyStruct, а затем использовать эту функцию для создания экземпляра потока.
Поток — это контекст выполнения, и для его создания необходим набор инструкций для его выполнения.
В Java мы видим это в форме Runnable, который используется для создания потока, который затем может быть start()
редактор
В C / C ++ с Boost вы должны использовать указатель на функцию.
Термин «вызываемый тип» примерно переводится как «тип, который можно заменить указателем функции».
Если вы хотите работать с произвольной структурой, как в вашем примере, MyStruct
Сначала вы должны определить набор инструкций (функция), которая работает с этим типом.
Когда вы знаете набор инструкций, вы можете передать указатель на эту функцию для создания потока, а затем запустить этот поток с произвольными экземплярами MyStruct.
Код следует:
struct MyStruct {
MyStruct(...) { ... }
};
int frobnicateMyStruct( const MyStruct& msr ) {
/* some operations on msr */
return 0;
}
void foo() {
MyStruct myStructInstance;
boost::thread(&frobnicateMyStruct, myStructInstance);
/* ... */
return;
}
Я не совсем уверен, какова цель, но следующее будет называть MyStruct()
:
boost::thread(boost::bind(boost::value_factory<MyStruct>()));
Вы также можете передавать аргументы, например, с помощью MyStruct(int i, int j)
:
boost::thread(boost::bind(boost::value_factory<MyStruct>(), 1, 2));
Вместо:
boost::thread(&MyStruct, ...);
Вызвать экземпляр:
boost::thread(MyStruct(), ...);