【问题标题】:Threads reading and writing same variable线程读取和写入相同的变量
【发布时间】:2015-10-30 07:59:09
【问题描述】:

我想知道在 2 个线程的情况下我是否需要一个锁,一个读取,另一个写入同一个变量。
例如:我们有 2 个线程:A 和 B,线程 A 在时间 T 读取变量 x,线程 B 在时间 T 写入变量 T。 我应该在这里考虑某种类型的锁吗?

就我而言,我有主线程和许多其他子线程。主线程拥有List<myObj>,在启动任何子线程之前,我创建myObj 的实例,将其分配给List<myObj>,并将myObj 传递给子线程。
在确定的时刻,必须根据myObj 中包含的值对列表进行排序,并且很可能会发生主线程读取的List 元素同时由子线程写入。

请给点建议。

【问题讨论】:

标签: c# multithreading variables


【解决方案1】:

在您深入彻底地了解多线程的工作原理之前,不要考虑任何替代方案。必填链接:http://www.albahari.com/threading/,至少。除非你有充分的理由,否则即使如此 - 尤其是像 List 这样复杂的东西。

在您访问任何共享状态时,请确保所有共享状态的方式都是同步的。

可以使用无锁同步,但这是一个相当高级的主题,并且容易出错。如果您只更新原始值,Interlocked 可能就足够了。

但是,不要忘记您正在使用的对象的合同 - List 的排序仅在项目在排序期间不更改时才是安全的。因此,在开始排序之前,您需要确保 noöne 正在修改任何可能在排序过程中改变排序的内容。

真的需要那些子线程吗?他们真的需要从单独的线程更新列表(/items)吗?也许将更改发布到 UI 线程就可以很好地工作,同时避免那些多线程问题?

【讨论】:

  • 因为它是关于服务器-客户端 tcp 通信中的客户端线程,所以是的,它们是必需的。谢谢你的回答,很有帮助!
  • @DientesDeCheto 实际上,TCP 通信可以完全异步完成,不需要多线程。如果你只是让所有的延续在 UI 线程上执行,你就避免了所有的麻烦,并且不会在阻塞调用上浪费线程:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 2014-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-14
相关资源
最近更新 更多