Сбой многопоточного приложения - возможно ли повреждение памяти? - PullRequest
0 голосов
/ 19 февраля 2011

У меня есть многопоточное приложение в c #, которое в основном использует lock () для доступа к словарю.Есть 2 темы, потребитель и производитель.Механизм блокировки очень прост.Это приложение работает под большой нагрузкой в ​​течение нескольких недель без проблем.

Сегодня оно просто рухнуло.Я покопался в WinDbg, чтобы увидеть Исключение, и это был KeyNotFound при доступе к Словарю.

Какие проблемы могут вызвать этот сбой?Должен ли я считать, что повреждение памяти в конечном итоге может произойти или нет?

Ответы [ 2 ]

9 голосов
/ 19 февраля 2011

Это может привести к слишком мелкозернистой блокировке. Например:

    bool hasKey(string key) {
        lock (_locker) {
            return _dictionary.ContainsKey(key);
        }
    }
    int getValue(string key) {
        lock (_locker) {
            return _dictionary[key];
        }
    }

И затем использовать это так:

    void Kaboom() {
        if (hasKey("foo")) {
            int value = getValue("foo");
            // etc..
        }
    }

Это не сработает, словарь может меняться между вызовами hasKey и getValue. Вся операция должна быть заблокирована. И да, это идет раз в месяц или около того.

    bool tryGetValue(string key, out int value) {
        lock (_locker) {
            if (!hasKey(key)) return false;
            value = getValue(key);
            return true;
        }
    }
0 голосов
/ 19 мая 2011

Мы заметили различные проблемы в нашем коде CMS Framework при использовании

dictionary.ContainsKey ... вместо этого мы изменили код для использования блока try..catch и, что удивительно, это исправило наши проблемы ... пожалуйста, также попробуйте изменить свою функцию на что-то вроде этого:

 int getValue(string key) {
            lock (_locker) {
    try {
     return _dictionary[key];
    } catch {
    return null // or "" or whatever would fit....
    }
            }
        }

посмотрим, поможет ли это ...

...