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

C# 在c中创建线程安全变量#,c#,.net,multithreading,thread-safety,threadstatic,C#,.net,Multithreading,Thread Safety,Threadstatic,我有一个静态变量,它由多个对象中的多个线程访问。问题是如果我在一个线程中设置了值,它不会反映在另一个线程中。 为了解决这个问题,我将变量thread设置为static,但在一个线程中更改的值仍然反映在另一个线程中。我就是这样声明变量的: [ThreadStatic] public static string ThreadVar; 关于如何解决这个问题有什么建议吗?编译器和JIT可以自由地假设字段不会被多个线程更改,并且如果可以证明当前线程在两次读取之间不能更改值,则可以优化同一字段的重取 标记

我有一个静态变量,它由多个对象中的多个线程访问。问题是如果我在一个线程中设置了值,它不会反映在另一个线程中。 为了解决这个问题,我将变量thread设置为static,但在一个线程中更改的值仍然反映在另一个线程中。我就是这样声明变量的:

[ThreadStatic]
public static string ThreadVar;

关于如何解决这个问题有什么建议吗?

编译器和JIT可以自由地假设字段不会被多个线程更改,并且如果可以证明当前线程在两次读取之间不能更改值,则可以优化同一字段的重取

标记字段
volatile
传达了相反的信息:您希望该字段会被外力(包括其他线程)更改,并且编译器/JIT不得优化任何重新获取

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


相比之下,
[ThreadStatic]
告诉编译器,每个线程都应该有自己的变量副本,而基于您的问题,这根本不是您想要的。

编译器和JIT可以自由地假设字段不会被多个线程更改,如果可以证明当前线程无法在两次回迁之间更改值,则可以优化相同字段的回迁

标记字段
volatile
传达了相反的信息:您希望该字段会被外力(包括其他线程)更改,并且编译器/JIT不得优化任何重新获取

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


相比之下,
[ThreadStatic]
告诉编译器,每个线程都应该有自己的变量副本,而基于您的问题,这根本不是您想要的。

ThreadStatic则恰恰相反-。每个线程都将访问它自己的变量。可能的副本需要使用一些锁定,以确保一次只有一个线程访问它。看看readerwriterlock@MikeNorgate对引用的读写都是原子的,而且由于
string
是不可变的,所以在这种情况下似乎不需要锁定。(这并不是说OP没有做线程不安全的事情,只是锁定并不总是必要的。)@cdhowie我不知道。你能给我发一个关于ThreadStatic的更多信息的链接吗。每个线程都将访问它自己的变量。可能的副本需要使用一些锁定,以确保一次只有一个线程访问它。看看readerwriterlock@MikeNorgate对引用的读写都是原子的,而且由于
string
是不可变的,所以在这种情况下似乎不需要锁定。(这并不是说OP没有做线程不安全的事情,只是锁定并不总是必要的。)@cdhowie我不知道。你能给我发一个关于这个的链接吗