1

我有一个 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(); }

——这是一个可靠、快速和有效的设计吗?

4

0 回答 0