Я пытаюсь написать функцию, которая обрабатывает как входные аргументы, так и возвращаемые значения из потока в группе потоков.
Мой пример класса:
// includes...
class MyClass(int id)
{
thread_id = id;
i = id* 5;
b = false;
}
void resetCounter(int j){
i = j * 5;
}
int getId(){
return id;
}
bool getBool(){
return b;
}
void DoWork(){
while( i > 0 ){
boost::this_thread::sleep(boost::posix_time::seconds(i));
i--;
}
b = true; // DoWork will in the real code be able to return false!
}
private:
bool b;
int i;
int thread_id
};
boost::threadgroup threads;
Пример кода:
bool exist = false;
for(int i=0;i<4;i++){
// first check if thread id exist (possible)?
// If so don´t create a new thread but reset the counter!
if(exist){
// in current thread call reset "i" (w.resetCounter(i))
}else{
MyClass m(i);
boost::function<void()> thread_func = boost::bind(&MyClass::DoWork, &m);
threads.create_thread(thread_func);
}
}
Я хочу перебрать потоки и иметь возможность проверить, вернул ли DoWork значение true.
Как мне это реализовать?
Прежде всего, с thread_group
Вы не можете перебирать объекты потока. Так что если это то, что вы хотите, рассмотрите возможность хранения объектов потока в каком-то другом контейнере.
Кроме того, вы не можете переносить ожидание завершения одного потока, но если вы не возражаете против использования API, специфичного для Windows, вы можете сделать это с помощью WaitForMultipleObjects
,
Тем не менее, я бы порекомендовал вам перепроектировать ваше приложение, чтобы избежать подобных уловок.
Других решений пока нет …