假设我有一个带有全局变量的类,一个方法和几个线程。
class Class
{
public var Var1;
piblic mainFoo()
{
thread1.start(thread_foo1);
thread2.start(thread_foo2);
}
public void Foo(var1, var2, var3)
{
...
}
private thread_foo1()
{
if(Var1) {}
Foo(_var1,_var2,_var3);
}
private thread_foo2()
{
if(Var1) {}
Foo(_var1,_var2,_var3);
}
}
除主线程外,Var1不会改变。 Foo不会改变任何线程中的任何数据,它只是一些我不想重复的小公共代码。这个结构会导致线程中出现任何问题或冲突吗?
答案 0 :(得分:1)
这取决于全局变量的类型。
1)全局变量是值类型
对于某些类型,包括bool
,它保证是原子的(请参见此处的列表,例如https://stackoverflow.com/a/5209632/2170171),因此您可以安全地跨线程读取/写入它们
对于其他类型,例如double
,这不是一个好主意 - 请参阅此示例https://stackoverflow.com/a/2736605/2170171
2)全局变量是引用类型
string
)ConcurentDictionary
)Dictionary
)