我有一个用pthreads编写的简单线程池,使用锁池实现,所以我知道哪些线程可用。每个线程还有一个等待的条件变量,因此我可以发出信号表明它可以正常工作。
当工作进来时,我通过查找锁池中的可用线程来选择一个线程。然后,我设置一个与线程关联的数据结构,该线程包含它需要做的工作,并在条件变量上发出信号,表明线程应该开始工作。
问题是线程何时完成工作。我需要解锁锁池中的线程,以便可以进行更多工作。但是,控制线程是设置锁定的线程,因此线程无法释放此锁定本身。 (并且控制线程不知道何时完成工作。)
有什么建议吗?
我可以重新架构我的线程池以使用一个队列,其中添加工作时所有线程都会发出信号,这样一个线程就可以抓住它。但是,将来,线程关联可能会对传入的工作造成问题,而锁池使实现更容易。
答案 0 :(得分:0)
在我看来,您尝试同步访问的数据是每个线程的忙/闲状态。
因此,有一个表(数组)记录每个线程的忙/闲状态,并使用互斥锁来保护对该表的访问。任何想要检查/更改线程状态的线程(控制器或工作者)都需要占用互斥锁,但只有在检查/更改状态时才需要保持锁定,而不是在线程工作的整个持续时间内。 / p>
要为线程分配工作,您可以:
pthread_mutex_lock(&thread_status_table_lock);
-- search table for available thread
-- assign work to that thread
-- set thread status to "busy"
pthread_mutex_unlock(&thread_status_table_lock);
-- signal the thread
当线程完成其工作时,它会将其状态更改回“free”:
pthread_mutex_lock(&thread_status_table_lock);
-- set thread status to "free"
pthread_mutex_unlock(&thread_status_table_lock);