Что касается ожидания, просто используйте thread::timed_join()
внутри основного потока, это вернет false
, если поток не завершился в течение заданного времени.
Уничтожение потока невозможно, если ваша сторонняя библиотека не знает о потоках boost:. Кроме того, вы почти наверняка не захотите «убить» поток, не предоставив функции возможность очистки.
Я бы посоветовал вам подождать, скажем, 2 секунды, а затем продолжить с каким-то сообщением об ошибке, позволяя каркасной функции завершить свою работу и просто игнорировать результат, если он пришел слишком поздно.
Что касается возврата значения, я бы предложил что-то вроде
struct myfunction {
MyObj returnValue;
void operator() () {
// ...
returnValue = theComputedReturnValue;
}
};
// ...
myfunction f;
boost::thread t = boost::thread(boost::ref(f));
t.join(); // or t.timed_join()...
use(f.returnValue);
// ...