【问题标题】:How to cause locks to be freed in one thread which were set by another如何在一个线程中释放由另一个线程设置的锁
【发布时间】:2011-04-02 03:29:05
【问题描述】:

我有一个简单的线程池,用 pthreads 编写,使用锁池实现,所以我知道哪些线程可用。每个线程还有一个它等待的条件变量,所以我可以发信号通知它工作。

当工作开始时,我通过从锁池中查找可用线程来选择一个线程。然后,我设置了一个与线程关联的数据结构,其中包含它需要做的工作,并在条件变量上发出信号表明线程应该开始工作。

问题是线程何时完成工作。我需要解锁锁池中的线程,以便它可以用于更多工作。但是,控制线程是设置锁的线程,所以线程不能自己释放这个锁。 (并且控制线程不知道工作何时完成。)

有什么建议吗?

我可以重新构建我的线程池以使用一个队列,在该队列中,当添加工作时所有线程都会发出信号,以便一个线程可以抓取它。但是,在未来,线程亲和性可能会成为传入工作的问题,而锁池使这更容易实现。

【问题讨论】:

  • 使用 pthreads API 可以确定特定线程的运行状态,例如线程是否完成了它的工作?

标签: locking pthreads mutex threadpool


【解决方案1】:

在我看来,您尝试同步访问的数据是每个线程的忙/闲状态。

所以,有一个表(数组)记录每个线程的忙/闲状态,并使用互斥锁来保护对该表的访问。任何想要检查/更改线程状态的线程(控制器或工作人员)都需要抓住互斥锁,但只有在检查/更改状态时才需要持有锁,而不是在线程工作的整个持续时间内。 /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

当线程完成其工作时,它会将其状态改回“空闲”:

pthread_mutex_lock(&thread_status_table_lock);
-- set thread status to "free"
pthread_mutex_unlock(&thread_status_table_lock);

【讨论】:

  • 这基本上回答了我的问题。我意识到我实现我的池的方式存在一个根本缺陷。我应该有一个锁,然后是一组状态变量,而不是为池中的每个项目设置一组锁。这也可能更有效。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-25
  • 2018-07-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
相关资源
最近更新 更多