检测线程结束

时间:2017-01-20 07:24:50

标签: multithreading c++11

如何检测线程何时结束(以独立于平台的方式)? 我必须为每个线程存储对象的副本,我想知道何时可以处理或重新分发它。

2 个答案:

答案 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_allnotify_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以找出哪些线程已经完成。