8

使用以下代码,在多线程环境中会发生什么:

static Dictionary<string,string> _events = new Dictionary<string,string>();

public static Dictionary<string,string> Events { get { return _events;} }

public static void ResetDictionary()
{
    _events = new Dictionary<string,string>();
}

在多线程环境中,不同线程可以同时访问此方法和属性。

将新对象分配给可在不同线程中访问的静态变量是否线程安全?会出什么问题?

是否有时间事件可以为空?例如,如果 2 个线程同时Events调用ResetDictionary()

4

2 回答 2

13

将新对象分配给可在不同线程中访问的静态变量是否线程安全?

基本上,是的。从某种意义上说,该属性永远不会无效或null.

会出什么问题?

在另一个线程重置旧字典后,阅读线程可以继续使用旧字典。这有多糟糕完全取决于您的程序逻辑和要求。

于 2013-08-16T12:11:34.993 回答
0

如果您想控制多线程环境中的所有内容,则必须使用所有踏板都可以访问的标志并控制您在字典中使用的方法!

// the dictionary
static Dictionary<string, string> _events = new Dictionary<string, string>();

// public boolean
static bool isIdle = true;

// metod that a thread calls
bool doSomthingToDictionary()
{
    // if another thread is using this method do nothing,
    // just return false. (the thread will get false and try another time!)
    if (!isIdle) return false;

    // if it is Idle then:
    isIdle = false;
    ResetDictionary(); // do anything to your dictionary here
    isIdle = true;
    return true;
}

另一件事!您可以使用 Invoke 方法确保当一个线程在另一个线程中操作变量或调用函数时,其他线程不会!查看链接: 调用跨线程事件的最干净的方法

于 2013-08-16T12:46:16.553 回答