如何检测线程何时结束(以独立于平台的方式)? 我必须为每个线程存储对象的副本,我想知道何时可以处理或重新分发它。
答案 0 :(得分:1)
可能是通过RAII和local_thread机制。我们创建了一个在析构函数中有用的类。
class ThreadEndNotifer
{
public:
~ThreadEndNotifer()
{
// Do usefull work
useFullWork();
}
}
接下来,我们创建local_thread
变量。它可以是全局或类feild(thread_local类字段是隐式静态)。
class Foo
{
private:
// Remember about initialization like static feild
thread_local ThreadEndNotifer mNotifer;
}
因此,每当任何线程结束时,都会调用useFullWork
。
我喜欢创建一个全局变量并仅在需要时启动它,这样我就可以避免开销。
答案 1 :(得分:0)
对于多个线程,为了检测其中任何一个已结束,您需要:
用于通知的共享condition_variable
,用于锁定的共享mutex
以及用于所有线程的条件的共享变量。
void call_me_at_the_end_of_a_thread(int index_of_thread){
std::unique_lock<std::mutex> l(the_global_mutex);
array_of_bools[index_of_thread] = true;
num_of_dead_threads++; // global integer only for the convenience of checking before wait
std::notify_all_at_thread_exit(the_global_condition_variable, std::move(l));
}
您可以使用bool或vector<bool>
数组来检查哪些线程已结束。如果你不关心当前帖子完成后通知的时间,那么你可能更喜欢notify_all
到notify_all_at_thread_exit
。
void call_me_to_detect_thread_was_ended(void){
static int copy_of_num_of_dead_threads;
std::unique_lock<std::mutex> l(the_global_mutex);
while(num_of_dead_threads==copy_of_num_of_dead_threads)
the_global_condition_variable.wait(l);
std::cout<<num_of_dead_threads - copy_of_num_of_dead_threads<<" threads finished.\n";
copy_of_num_of_dead_threads=num_of_dead_threads;
}
num_of_dead_threads
只是为了简单起见。检查array_of_bools
以找出哪些线程已经完成。