线程读写相同的变量

时间:2015-10-30 07:59:09

标签: c# multithreading variables

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

在我的情况下,我有主线程和许多其他SubThreads。主线程持有List<myObj>,在开始任何SubThread之前,我创建myObj个实例,将其分配给List<myObj>并将myObj传递给SubThread。
在确定的时刻,List必须根据myObj中包含的值进行排序,并且完全发生主线程读取的List元素同时由SubThread写入。

请一些建议。

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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