Автоматически проверять некоторые ограничения потоков? (С#)

В нашей кодовой базе есть много ограничений на потоки, закодированные в комментариях, например:

  • Этот класс потокобезопасен (все общедоступные методы могут быть безопасно доступны из любого потока).
  • Необходимо удерживать блокировку «xyz» для доступа/вызова любых публичных членов.
  • Должен быть доступен только из потока "xyz" (обычно, но не всегда относится к потоку GUI)
  • Эта блокировка должна быть взята после блокировки "xyz", если требуются обе

Первые три можно увидеть как на классах, так и на отдельных членах.

Я искал любые решения, которые могли бы хотя бы частично проверить, выполняются ли эти ограничения. Я понимаю, что существуют серьезные ограничения на то, насколько это может быть сделано автоматически, но даже небольшая помощь от инструмента действительно поможет. Я не мог найти ни одного, хотя.

Можете ли вы предложить инструмент, чтобы сделать что-то в этом направлении? Возможно, набор правил FxCop, который работает, кодируя вышеуказанные ограничения как атрибуты?


person Roman Starkov    schedule 25.01.2010    source источник


Ответы (3)


Я не знаю каких-либо конкретных атрибутов безопасности потоков, просто потому, что это слишком сложно. А «тестирование» многопоточного кода (с добавлением дополнительных Debug.Assert и т. д.) является частой причиной гейзенбагов. Вы могли бы посмотреть на "CHESS"? Это не панацея, но может быть полезно.

person Marc Gravell    schedule 25.01.2010
comment
Я наткнулся на CHESS и собирался попробовать в следующий раз, когда возникнет проблема. Похоже, то, что я ищу, не существует. Во всяком случае, пока нет. Надеемся, что такие исследования, как springerlink.com/content/877541x4p9151668, в конечном итоге изменят это положение. - person Roman Starkov; 25.01.2010

Не знаю, как это сделать во время компиляции, но, возможно, можно использовать PostSharp. чтобы определить ограничения, а не помещать их в комментарии (например, ваши ограничения могут быть указаны как атрибуты методов или класса).

person David_001    schedule 29.01.2010

Вы можете попробовать реализовать некоторые пользовательские правила FxCop (активируемые с помощью соответствующего атрибута). Это может помочь вам проверить некоторое простое состояние (например, этот класс является потокобезопасным, поскольку не содержит изменяемого состояния).

Другая проверка, вероятно, будет более сложной (например, может ли FxCop проверить, что когда установлено поле «X», это всегда делается, когда мы удерживаем данную блокировку) - возможно. Если это важно, я бы посоветовал взглянуть на FxCop SDK и посмотреть, насколько сложным будет такой тест.

Я обнаружил, что реализация пользовательских правил FxCop очень полезна, особенно когда мы контролируем структуру тестируемых классов.

person Dennis Sellinger    schedule 30.01.2010