在c#中创建线程安全变量

时间:2014-07-28 14:43:50

标签: c# .net multithreading thread-safety threadstatic

我有一个静态变量,可由多个对象中的多个线程访问。问题是如果我在一个线程中设置值,它不反映在另一个线程中。 为了解决这个问题,我将变量线程设置为静态但仍然在一个线程中更改的值确实反映在另一个线程中。这就是我宣布变量的方式:

[ThreadStatic]
public static string ThreadVar;

有关如何解决问题的任何建议吗?

1 个答案:

答案 0 :(得分:4)

编译器和JIT可以自由地假设多个线程不会更改字段,并且如果可以证明当前线程在提取之间不能更改该值,则可以优化远离相同字段的重新提取。 / p>

标记字段volatile传达相反的信息:您希望外部力(包括其他线程)更改字段,并且编译器/ JIT 不得优化任何重新开发-fetches。

请注意,标记字段volatile并不意味着该字段的所有使用都是线程安全的,它只意味着一个线程会注意到另一个线程将新值写入字段时。我们需要查看更多代码以确定是否存在线程安全问题。

相比之下,

[ThreadStatic]告诉编译器每个线程应该有自己的变量副本,根据你的问题根本不是你想要的。