Передать адрес типа структуры в boost :: thread?

Используя потоки 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)?

Дальнейшее чтение о том, как сделать это с помощью функций

1

Решение

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;
}
1

Другие решения

Я не совсем уверен, какова цель, но следующее будет называть MyStruct():

boost::thread(boost::bind(boost::value_factory<MyStruct>()));

Вы также можете передавать аргументы, например, с помощью MyStruct(int i, int j):

boost::thread(boost::bind(boost::value_factory<MyStruct>(), 1, 2));
1

Вместо:

boost::thread(&MyStruct, ...);

Вызвать экземпляр:

boost::thread(MyStruct(), ...);
0
По вопросам рекламы [email protected]