c# - 锁与 Interlocked.Exchange

标签 c# multithreading locking task interlocked

我有一个应用程序,它不断地(+-100 毫秒)从 PLC 读取订单,然后将它们放入模型中,然后由多个客户端读取。 为此,我使用了 lock 语句。

订单阅读线程:

lock (model) {
//update object
}

客户阅读:

lock (model) {
//serialize object to json string
}
send over tcp stream to client.

但我也可以用于更新:

Interlocked.ExChange(oldObj, newObj)

我不希望我的客户必须等待订单读取线程中发生的锁定。 而且我绝对不希望客户阻止我的订单阅读线程。

我最好还是使用 Interlocked 吗?

多谢指教!

最佳答案

是的,您最好使用 Interlocked,因为它更高效,因为它主要被转换为单个原子操作。

但是,如果您不介意客户端仍然读取旧对象一段时间,您甚至可以不使用 Interlocked 并设置一个新实例。

碰巧获得新实例的客户端将获得更新的数据,而那些没有获得新实例的客户端将在下一次检查中获得它。

关于c# - 锁与 Interlocked.Exchange,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32121684/

相关文章:

c# - 绑定(bind)到 (Validation.Errors).CurrentItem 不适用于 TextBox(适用于 DataGrid)

c# - Ajax.BeginForm beforeSubmit 事件

c# - 验证银行分类代码

c++ - QThreadPool 示例

c++ - 多线程 - 希望是一个简单的任务

python - 如何在多进程系统中实现锁?

c++ - 使用锁和 STL 算法对 c++ vector 进行排序,还是编写更复杂的无锁算法?

c# - 拦截SqlCommand对数据库执行的查询

java - Android Java 每毫秒绘制到 Canvas

linux - flock 在注销/重启时不会被释放