0

我在设计代码的工作方式时遇到了一些困难:

  1. 序列号 #1(随时接收数据)调用Routine()如果某个特定的接收值A > constant1,但仅当Routine()未运行时,否则只有最后一次调用将在Routine()结束后运行
  2. Serial #2(随时接收数据)将接收到的数据设置为BC
  3. Routine()检查是否C > constant2并将BC保存到文件中
  4. 计时器(每 N 秒)运行另一个例程,检查保存的文件并发送电子邮件(在保存BC时不干扰Routine()

我当前的设计使用了几个全局布尔值,但我认为这会产生一些问题(由于布尔值在检查它和再次设置它以启动“锁定”过程之间发生变化)。

那么,解决此类同步问题的推荐方法是什么?锁定(someGlobalObject)?,使用监视器?(我如何丢弃多个挂起的routine() 调用?),互斥量?,信号量?

谢谢!

4

1 回答 1

0

首先,lock 和 Monitor 在功能上是相同的。
Lock 语句与 Monitor.Enter 方法

现在,一般来说,当我编写多线程代码时,决定是在 ReaderWriterLock(ReaderWriterLockSlim,如果在 .NET 3.5 或更高版本上)和 lock() 之间。当您有多个线程需要写入同一个对象而需要读取的线程很少时,lock() 的性能会更好。当并发数据的读取频率(以及从多个线程)比写入的频率高得多时,ReaderWriterLocks 的性能会更好。

ReaderWriterLock 与锁{}

如果我正确理解您的示例,则 B 和 C 是从多个线程访问的对象。看起来它们是从一个线程写入并从另外两个线程读取的。所以,我建议这一切都取决于读写的频率。如果 B 和 C 的写入频率远高于读取频率,请尝试使用 lock() 语句。否则,如果它们被更频繁地阅读,请使用 ReaderWriterLock(Slim) 对象。显然,您需要运行一些测试来确定一个是否比另一个更好。任何一个都应该解决问题,尽管一个最有可能比另一个更快。

于 2013-05-18T04:04:16.573 回答