Подводные камни при использовании объектов синхронизации MFC - PullRequest
1 голос
/ 22 августа 2011

Я использовал объекты синхронизации MFC в моих проектах без каких-либо проблем.Но недавно я наткнулся на статью, в которой объясняется, синхронизация MFC совершенно неверна Я не уверен, о какой версии MFC он говорит, но я серьезно считаю, что MFC повзрослел в последних версиях.Я использую библиотеку MFC, которая поставляется вместе с установкой Visual Studio 2008.Безопасно ли использовать библиотеки MFC этой версии специально для синхронизации?

Ответы [ 2 ]

1 голос
/ 22 августа 2011

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

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

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

1 голос
/ 22 августа 2011

Авторские утверждения подходят не для каждого условия, а для определенного набора условий. Lock возвращает BOOL, и вам, в основном, было бы все равно, если он потерпит неудачу по какой-либо причине. Большую часть времени вы звоните, чтобы получить блокировку или ждать. В других случаях FALSE будет означать неудачу. А если вам нужно проверить время ожидания, вы можете использовать собственный API (что встречается редко).

Рекурсивно CSingleLock абсурдно. Вы не используете тот же объект для блокировки. Вы можете безопасно использовать несколько CSinlgeLock объектов для получения рекурсивного доступа.

CEvent, CMutex и другие классы именованных объектов могут использоваться в процессе. Я использовал это!

Я не использую семафоры. Может быть, некоторые другие могут комментировать.

...