English 中文(简体)
C 全球组合环境的接近安全
原标题:
  • 时间:2009-05-28 19:21:41
  •  标签:

在“C# app”中,我有一个单一的全球类别,包含一些组合项目,如:

public class Options  
{  
    int myConfigInt;  
    string myConfigString;  
    ..etc.  
}  

static Options GlobalOptions;  

这一类成员将使用不同的深层:

Thread1: GlobalOptions.myConfigString = blah;

段 次 页 次

Thread2: string thingie = GlobalOptions.myConfigString;

如果两条镜子接触不同成员,则使用24小时进入全球试剂也是不必要的障碍,但另一方面,对每个成员来说,形成一对一目标似乎也比上。

Also, using a lock on the global options would make my code less nice I think; if I have to write

string stringiwanttouse;
lock(GlobalOptions)
{
   stringiwanttouse = GlobalOptions.myConfigString;
}

任何地方(现在,这是否好像是安全,还是扼杀了我们。 Yeah, I m new to C#......)

string stringiwanttouse = GlobalOptions.myConfigString;

这使法典变得可怕。

So... What is the best (and simplest!) way to ensure thread-safety ?

问题回答

你可以把所涉领域(本案中的婚姻)划归财产,并在Get/Set使用监测器。 洛克或穆特克斯。 然后,取用财产只能锁定单一领域,并锁定整个类别。

Edit: 增加法典

private static object obj = new object(); // only used for locking
public static string MyConfigString {
    get {
       lock(obj)
       {
          return myConfigstring;
       }
    }
    set {
       lock(obj)
       {
          myConfigstring = value;
       }
    }
}

The following was written before the OP sedit:

public static class Options
{
    private static int _myConfigInt;
    private static string _myConfigString;

    private static bool _initialized = false;
    private static object _locker = new object();

    private static void InitializeIfNeeded()
    {
        if (!_initialized) {
            lock (_locker) {
                if (!_initialized) {
                    ReadConfiguration();
                    _initalized = true;
                }
            }
        }
    }

    private static void ReadConfiguration() { // ... }

    public static int MyConfigInt {
        get {
            InitializeIfNeeded();
            return _myConfigInt;
        }
    }

    public static string MyConfigString {
        get {
            InitializeIfNeeded();
            return _myConfigstring;
        }
    }
    //..etc. 
}

在此之后,我可以说,你应当做像上述那样的事情,而且只是在一个地方——组合类别——设置组合。 这样,它将是唯一在运行时间修改组合的班级,而且只有在将收回组合选择的情况下。

你们的组合可能是全球性的,但应当而不是<>>>作为全球变量暴露。 如果配置不作改动,就应当用来构造需要信息的物体,无论是人工还是工厂物体。 如果它们can改变,那么就有一个标注组合文件/数据库/名称,并执行。 应使用观察员模式

www.un.org/Depts/DGACM/index_spanish.htm 全球变量(即使是属于一类的变量)是Bad ThingTM。

你们通过安全感意味着什么? 它不是需要安全阅读的全球目标,而是使用守则。 如果两条对一个成员变量的读写接近同一时段,其中一条将“双赢”,而是一个问题? 如果你的客户守则取决于全球价值不变,直到与一些处理单位一起进行,那么,你将需要为每个需要锁定的财产设定一个同步目标。 这里没有任何东西。 你只能拿到一份当地价值的副本来避免问题,但这一固定办法的适用将取决于你的情况。 而且,我不会因违约而为每个财产制造一个 object子,而是因为你认识到,需要这样做。





相关问题
热门标签