【问题标题】:One lock that signals multiple threads when unlocked一个锁在解锁时向多个线程发出信号
【发布时间】:2017-07-13 16:55:30
【问题描述】:

有没有办法实现一个由两个组件使用的锁,当由多个线程组成的第一个组件等待一个锁定的锁,而第二个组件接收到锁并解锁它时,这会通知所有其他等待的线程是吗?

它需要是跨平台的(它将用C实现)。

那么有没有办法设计这样的东西?

【问题讨论】:

  • 如果这些线程仍在等待,发出信号有什么意义?
  • 不要使用锁来做除锁以外的事情。如果要发送信号,请使用信号量、条件变量或其他适当的东西
  • 这些线程只是等到第二个组件完成工作,完成后才能继续工作
  • 如何使用信号量来实现?也许我错过了什么
  • 我不确定我是否理解“由多个线程组成的组件”的概念。这是一个必须发出信号的线程组 A 而不是必须发出信号的线程组 B 吗?无论如何,我会指导您使用上面建议的条件变量。如果您使用的是 POSIX,那么您可以从“pthread_cond_broadcast”开始。其他库可能有等效的方法。

标签: c multithreading synchronization locking semaphore


【解决方案1】:

没有一种跨平台解决方案可以同时用于 POSIX 和 Windows 系统,假设它们是您的目标系统。

在 POSIX 系统上,使用条件变量并调用 pthread_cond_broadcast() 来解除阻塞所有等待线程:

概要

#include <pthread.h>

int pthread_cond_broadcast(pthread_cond_t *cond);
int pthread_cond_signal(pthread_cond_t *cond);

描述

这些函数应该解除阻塞在条件变量上的线程。

pthread_cond_broadcast() 函数将解除阻塞当前在指定条件变量cond 上阻塞的所有线程

...

在 Windows 上,you can use WakeAllConditionVariable

唤醒所有等待指定条件变量的线程。

语法

C++

VOID WINAPI WakeAllConditionVariable(
  _Inout_ PCONDITION_VARIABLE ConditionVariable
);

编写自己的跨平台条件变量包装器并不难,它在 POSIX 系统上包装 POSIX 条件变量,在 Windows 系统上包装 Windows 条件变量。

【讨论】:

  • 酷,这似乎解决了我的问题。我还必须为每个线程创建一个锁(这不会做任何事情),这个条件变量才能工作,对吧?顺便说一下,这些条件变量是否有超时机制(在 POSIX 中?)
  • Nvm,我发现“pthread_cond_timedwait”在条件变量上有超时,看来我仍然必须使用什么都不做的锁。
  • POSIX 条件变量所需的互斥锁不会“什么都不做”。有很多使用POSIX条件变量的例子:google.com/search?q=pthread_cond_wait+example
猜你喜欢
  • 2023-03-24
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多