C# - 多线程 - 共享数据

时间:2009-11-27 03:34:56

标签: c# multithreading

线程是否可以在同一进程中共享数据(全局变量)。

7 个答案:

答案 0 :(得分:5)

您是否阅读了以下文章? http://msdn.microsoft.com/en-us/magazine/cc163744.aspx

答案 1 :(得分:2)

当然是。您只需要同步它们以避免死锁。在C#中使用lock标记代码中的关键部分。检查MSDN以获取详细信息。 : - )

答案 2 :(得分:1)

同一程序中的多个线程可以共享数据。但是,您必须了解数据访问和写入的潜在问题。通常,这会在写入或尝试访问相同资源时出现读取问题。 [查看有关race condictions]

的更多信息

答案 3 :(得分:1)

是的,无论是通过引用静态对象,公开提供跨线程的引用,还是通过跨线程编组(例如UI控件调用/调度调用,尽管这并不完全相同)。

虽然跨线程共享资源的同步绝对重要,但简单地提倡将锁(对象)作为一揽子方法并不一定适用于所有情况。如果您有两个线程,每个线程都锁定在另一个线程正在等待的共享对象上,那么您将陷入僵局,因此必须考虑设计和处理流程。

除非必要,否则不要锁定整个类,否则可能会提供不必要的开销并导致性能损失。对于需要同步的静态类,最好提供一个静态对象来锁定与共享状态交互的方法,而不是锁定整个类:  例如锁定(_staticLockObjectInstance)over lock(typeof(staticClass))

答案 4 :(得分:1)

通过post查看非常好的Jon Skeet。即使对于那些在线程上有点舒服的人来说也是一个很好的阅读。

答案 5 :(得分:0)

是。可能需要更多信息。

Object o = new Object();
int i; // Shared variable

lock(o)
{
    // work with i.
}

答案 6 :(得分:0)

同一进程中线程的默认行为是共享全局存储。

如果您不想要共享存储,则环境会提供thread local storage

如果您确实访问共享存储,那么您可能需要使用锁,原子操作或内存防护来同步对存储的访问。如果您忘记在代码的任何部分执行此操作,则可能会以不可预测的方式失败。