【问题标题】:Best match in C# to Java ReentrantLock and Condition?C# 与 Java ReentrantLock 和条件的最佳匹配?
【发布时间】:2009-03-05 20:30:11
【问题描述】:

另一个跨语言问题:谁能告诉我什么 C# 线程结构最匹配 Java ReentrantLock 和 Condition 类? ReentrantLock 有 lockInterruptibly() 和 unlock() 方法,而 Condition 有 signal() 和 await() 方法。正是这种组合,我希望能够在 C# 代码中保留 - 或类似的东西......提前致谢。

【问题讨论】:

    标签: c# java multithreading


    【解决方案1】:

    我认为您正在寻找的是静态 Monitor 类。我允许blockingnon-blocking 互斥体获取,以及condition variable 操作。 (他们称它们为 PulsePulseAllWait,而不是信号和等待)。

    【讨论】:

    • 似乎对我有用!谢谢!另一个问题:Monitor 是否提供 Java isHeldByCurrentThread() 的对应物?
    • 不,您可以扩展 Monitor 并保留对上次成功调用 Enter 或 TryEnter 的线程的引用。可以使用 Thread.CurrentThread 访问当前线程:msdn.microsoft.com/en-us/library/…
    • @BenS,Java taskEnded.await(10, TimeUnit.SECONDS); 的 C# 等价物是什么,其中 taskEnded 的类型为 java.util.concurrent.locks.ConditionMonitor.Wait 似乎不匹配。
    【解决方案2】:

    ReaderWriterLock 类也值得研究。这类似于 Java 中的ReentrantReadWriteLock

    【讨论】:

    • +1 用于指出相似之处。但 MSDN 建议使用 ReaderWriterLockSlim 而不是 ReaderWriterLock
    【解决方案3】:

    免责声明:我不知道这些 Java 类,我在这里是在摸索。

    在 C# 中,您有一个 lock 语句(我认为这类似于 Java 的 synchronized 语句),它可以锁定任何对象。我想使用那个语句,或者Monitor.Enter(obj)Monitor.Exit(obj) 会有点像 ReentrantLock。

    有两个类称为ManualResetEventAutoResetEvent。这些类有一个Wait 方法和一个Set 方法,我想这就像条件的信号和等待。这两个类之间的区别在于ManualResetEvent 保持设置(不再阻止任何人)并且必须是Reset。而AutoResetEvent 就像它的名字所暗示的那样 - 会自动重置。

    【讨论】:

    • 不能在异步语句中使用锁,并且需要从同步线程调用 Monitor 方法。Java 的 ReentrantLock 的重点是让这些问题消失。
    • 当被问到这个问题时,看到异步方法在 C# 或 Java 中都不存在,我认为这几乎不是 ReentrantLock 的重点,或者至少不是提问者所指的重点。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    相关资源
    最近更新 更多