Тест многопоточных замков - PullRequest
7 голосов
/ 04 апреля 2011

У меня есть класс, который использует блокировку чтения-записи.

Я хочу посмотреть, правильно ли я заблокировал и защитил все методы.
Существует ли шаблон проектирования для проверки правильности установки замков?

Edit:
Некоторые уточнения:

Это код C #, полученный из кода C ++ / CLI, который имеет блокировки на уровне C ++ ... Не все так просто. Вот почему я ищу дизайн для теста, а не дизайн для его блокировки.

Есть несколько вещей, которые необходимо проверять при многопоточности:

Нет тупиков (наиболее очевидно)
Корректность (если я обновлю его в 1 потоке, то будет видно в другом)
Атомная запись (если я пишу в одном потоке, я смогу читать только тогда, когда записано полное значение)
Справедливость (может быть более теоретическим, чтобы доказать, должно быть верно, если я все равно использую Mutex)

Ответы [ 2 ]

6 голосов
/ 04 апреля 2011

Возможно, вы захотите прочитать о SyncLock и SyncRoot, которые используются для создания общей схемы блокировки ваших объектов. Поскольку вы не хотите блокировать объект enitre, у вас часто есть SyncRoot, который вы заблокировали.

Примером этого является ArrayList или ICollection, которые оба имеют SyncRoot, который вы должны использовать для блокировки коллекции. Вы можете прочитать больше о Thread Synchronization на MSDN .

Но, как правило, Марк указал, будь осторожен, тестируй, тестируй, тестируй и делай еще тесты!

Пример SyncLock

public class Person
{
    public decimal Salary { get;set; }
    public string Name { get; set; }
    public readonly object SyncRoot = new object();
}

Затем вы можете подойти к замку так:

var person = new Person { Name = "Bill", Salary = 1000000 };

lock(person.SyncRoot)
{
    IncreasSalary();
}

A плохой паттерн должен сделать lock(this) НИКОГДА сделать это!

Существует также нечто, называемое Двойная проверка блокировки , которая не относится к .NET. Вы также можете прочитать эту статью по «Стратегическая блокировка, Потокобезопасный интерфейс и Блокировка по объему» .

Тестирование безопасности резьбы

Если вы хотите проверить безопасность потока, я рекомендую проверить «Модульное тестирование безопасности потока» , принятый ответ указывает на Microsoft Chess , который может помочь вам определить тупики в ваше заявление.

2 голосов
/ 04 апреля 2011

Вы знаете проблему, это первый шаг.Это (обычно) NP-полный ... однако есть инструменты:

  • helgrind

часть набора инструментов valgrind;это позволит проверить использование наиболее распространенных примитивов синхронизации;Вы могли бы рассказать о своих собственных примитивах.

  • Intel Parallel Inspector

Аналогично, давайте опишем ваши собственные примитивы для проверки во время использования.См. Intel Inspector сообщает о гонке данных в моей реализации спин-блокировки

Обновление Я только что обнаружил, что GNU libstdc (++) и GNU gcc существенно улучшили свою поддержку Helgrindсм. примечания к выпуску 4.6.x и на этой странице

. Здесь также содержатся ссылки на следующие дополнительные инструменты

...