【发布时间】:2010-10-29 16:37:34
【问题描述】:
在 C# 应用程序中,假设我有一个包含一些配置项的全局类,如下所示:
public class Options
{
int myConfigInt;
string myConfigString;
..etc.
}
static Options GlobalOptions;
这个类的成员将在不同的线程中使用:
Thread1: GlobalOptions.myConfigString = blah;
同时
Thread2: string thingie = GlobalOptions.myConfigString;
当 2 个线程访问不同的成员时,使用锁来访问 GlobalOptions 对象也将不必要地阻塞,但另一方面,为每个成员创建一个同步对象似乎也有点过头了。
此外,我认为在全局选项上使用锁定会使我的代码不太好; 如果我必须写
string stringiwanttouse;
lock(GlobalOptions)
{
stringiwanttouse = GlobalOptions.myConfigString;
}
无处不在(这是线程安全的还是 stringiwanttouse 现在只是指向 myConfigString 的指针?是的,我是 C# 的新手......)而不是
string stringiwanttouse = GlobalOptions.myConfigString;
它使代码看起来很糟糕。
所以... 确保线程安全的最佳(也是最简单!)方法是什么?
【问题讨论】:
-
我认为如果你能指定你要解决的问题会更清楚。两个线程同时设置一个全局值并没有内在的危险。 CLR 不会崩溃。您要解决什么样的同步问题?
-
好吧,当一个线程正在写入字符串而另一个线程试图读取它时会发生什么?我总是会得到一个或另一个字符串,还是会发生我得到一个部分覆盖的字符串?
标签: c# multithreading configuration