【问题标题】:Synchronisation object to lock in one thread and release in another同步对象锁定一个线程并释放另一个线程
【发布时间】:2014-07-07 09:58:17
【问题描述】:

我有一种情况,我想在函数调用中获取(锁定)资源,但在回调(不同的线程)中收到进程结束的信号。 (资源是外部的:基本上,当我启动时某个总线很忙,并且通过回调再次空闲。)

对于锁定/临界区,这根本不可能。我也试过 Mutex,但只得到异常,可能是因为我在另一个线程中释放。

这里有哪些选项?

好像可以

  1. 创建 bool 以“手动”同步它们(锁定对 volatile bool 的访问,然后执行 while() sleep 而不是 WaitOne)
  2. 使用事件在第三个包装线程中对整个事物进行单线程处理,然后该线程还管理同步对象

为了简单起见,我可能会选择布尔值。或者最好是运行时提供的任何机制。 回调来自外部库。

更新:我刚刚也发现了信号量,这似乎符合我的需要。如果有人有更好的想法/其他人也觉得这很有用,我会问任何人。

【问题讨论】:

  • 您能非常具体说明您想做什么吗?我怀疑你想要的可以用Monitor.WaitMonitor.Pulse/Monitor.PulseAll来完成
  • @Marc 我想同步多个线程同时请求我的操作。我的问题是操作从我开始请求到我的回调被调用。通过查看 MSDN 中的 Monitor,我无法在 2 个不同的线程中调用进入和离开。要使用 Pulse,我必须自己编写管理对资源的访问的逻辑。
  • @AndreasReiff 听起来你想要一个信号量,然后

标签: c# multithreading locking


【解决方案1】:

解决您的问题的一个简单方法是使用AutoResetEvent:您在一个线程中等待它,然后通知释放另一个线程中的锁。

【讨论】:

  • @ken2k 我这样做实际上是为了使异步调用同步:调用者请求操作并通过事件等待回调。但是现在我想同步多个线程同时请求操作,这是禁止的。
  • @AndreasReiff 如果你想同步 几个 线程,那么你应该使用信号量。
  • 是的,我会接受信号量。谢谢。我总是以某种方式从同步对象中错过它,尽管这(不同的线程)在我的应用程序中很常见。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
  • 1970-01-01
  • 2011-04-02
  • 2016-01-23
  • 2023-03-24
  • 1970-01-01
相关资源
最近更新 更多