Это сделает объект потокобезопасным? - PullRequest
1 голос
/ 12 марта 2010

У меня есть собственный COM-объект Visual C ++, и мне нужно сделать его полностью потокобезопасным, чтобы иметь возможность юридически пометить его как «свободный поток» в системном реестре. В частности, я должен убедиться, что не более одного потока одновременно обращается к любой переменной-члену объекта.

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

Вот что я придумала. Я добавляю мьютекс или критическую секцию в качестве переменной-члена объекта. Каждый COM-экспонированный метод получает мьютекс / секцию в начале и освобождает перед возвратом управления.

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

Хватит ли этого решения? Есть ли более простое решение?

Ответы [ 2 ]

3 голосов
/ 12 марта 2010

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

3 голосов
/ 12 марта 2010

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

...