我有一个 Threadpool 类,这个类有一个 wait() 方法。现在,这个类可以创建N个线程,当一个线程被创建时,它的句柄被插入到一个容器中。我实现wait()函数的经典方法,就是遍历容器,等待单个句柄,像这样:
thread_handle_iterator th = get_first_thread_handle_iterator();
thread_handle_iterator th2 = get_last_thread_handle_iterator();
while (th != th2)
{
joint(*th);
++th;
}
这非常有效。现在,不用这个循环,我可以让原子计数器在每个线程开始运行时递增,然后在线程完成运行时递减。当 count==0 [最后一个线程正在完成] 时,会触发一个事件 [或 posix 中的条件变量]。像这样:
int
thread_entrypoint(Threadpool * p)
{
int result;
p->atomic_thread_count.add();
result = p->getRunnable()->run(); // execute the thread code.
if (p->atomic_thread_count.fetchAndAdd(-1) == 1) // this is the last thread!
{
p->event.signal(); // fires the event/condition variable
}
return result; // the thread returns the result and exits.
}
所以,基本上通过这种方式,我不会有一个烦人的容器,并且我可以在创建它们时分离所有线程:这将大大简化我的代码。然后,即使线程池的线程被分离,我仍然可以等待它们完成,只需调用Threapool::wait() { event.wait(); }
另外,我的优势是我可以添加一个全局原子计数器,所以我可以等待每个Threadpool 实例创建的每个线程,如下所示:
AtomicInt global_threads_count;
WaitEvent global_all_threads_exited_event;
int
thread_entrypoint(Threadpool * p)
{
int result;
p->atomic_thread_count.add();
global_threads_count.add();
result = p->getRunnable()->run(); // execute the thread code.
if (p->atomic_thread_count.fetchAndAdd(-1) == 1) // this is the last thread!
{
p->event.signal(); // fires the event/condition variable
}
if (global_threads_count.fetchAndAdd(-1) == 1) // this is the last thread of *ALL* threads!
{
global_all_threads_exited_event.signal(); // fires the event/condition variable
}
return result; // the thread returns the result and exits.
}
我可以通过调用来等待所有线程完成Threapool::waitForAllThreads() { global_all_threads_exited_event.wait(); }
——这是一个可靠、快速和有效的设计吗?