Форум программистов, компьютерный форум CyberForum.ru

Потокозащищённые классы и их интерфейс - C++

Восстановить пароль Регистрация
 
ZiminAS1990
 Аватар для ZiminAS1990
2 / 2 / 0
Регистрация: 27.07.2012
Сообщений: 31
15.12.2012, 22:30     Потокозащищённые классы и их интерфейс #1
Доброе время суток, уважаемые форумчане!

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

Это скрывает мьютекс от пользователя. Удобно. Но сегодня я обнаружил вот что:
бывают ситуации, когда для объекта необходимо последовательно вызвать несколько интерфейсных функций так, чтобы между их вызовами мьютекс НЕ освобождался. Выше мы отметили, что мьютекс освобождается каждый раз по завершении работы интерфейсной функции... как тогда быть?

Я рассмотрел такой вариант:
Для каждой интерфейсной функции класса создать функцию с аналогичным именем, но с суффиксом "Safe". Например:
bool installModule();
bool installModuleSafe();
Интерфейсная функция без суффикса не будет потокозащищённой. Весь код функции с суффиксом сводится к захвату мьютекса, вызову функции без суффикса и освобождению мьютекса:

bool installModuleSafe()
{
thrAutoMutex autoMutex(this->mutex);
return installModule();
}

(thrAutoMutex в конструкторе захватыват переданный мьютекс, а в декструкторе - освобождает)

Так же к классу нужно функции lock() и free(), который просто захватывают и освобождают мьютекс.
Обычно пользователь использует безопасные функции, но если ему нужно вызвать несколько функций не освобождая мьютекс, то он вызывает lock(), затем несколько незащищённых интерфейсных функций, а затем free()

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

А если нету, то насколько адекватным можно считать написанное выше?

Благодарю за ответы
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.12.2012, 22:30     Потокозащищённые классы и их интерфейс
Посмотрите здесь:

C++ Интерфейс к DLL
Графический интерфейс C++
C++ Графический интерфейс
C++ Интерфейс
интерфейс C++
C++ Пользовательский интерфейс
Интерфейс в с++ C++
Графический интерфейс C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
15.12.2012, 22:38     Потокозащищённые классы и их интерфейс #2
вполне себе адекватно на мой взгляд.
только бы по умолчанию, основной класс я бы не стал загромождать потокозащищенными функциями, а сделал бы это в отдельном классе-обертке, который бы и хранил мьютекс и захватывал бы его, перед перевызовом основной функции. это не всегда может прокатить, но в случае, когда на весь класс один мьютекс - вполне себе.
ZiminAS1990
 Аватар для ZiminAS1990
2 / 2 / 0
Регистрация: 27.07.2012
Сообщений: 31
15.12.2012, 23:04  [ТС]     Потокозащищённые классы и их интерфейс #3
Цитата Сообщение от DU Посмотреть сообщение
вполне себе адекватно на мой взгляд.
только бы по умолчанию, основной класс я бы не стал загромождать потокозащищенными функциями, а сделал бы это в отдельном классе-обертке, который бы и хранил мьютекс и захватывал бы его, перед перевызовом основной функции. это не всегда может прокатить, но в случае, когда на весь класс один мьютекс - вполне себе.
О! Класс-обёртка с мьютексом внутри - хорошая идея, спасибо
Yandex
Объявления
15.12.2012, 23:04     Потокозащищённые классы и их интерфейс
Ответ Создать тему
Опции темы

Текущее время: 07:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru