Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Сделать свой шаблон вектора http://www.cyberforum.ru/cpp-beginners/thread733056.html
надо сделать шаблон вектора,посмотрите то что сделал это правильно? и еще вопрос,можете помочь сделать итератор,а то что то вообще не могу разобраться а так же функцию как у вектора push_back()...
C++ Реализовать динамический массив объектов, учитывая, что параметры для конструктора у каждого объекта разные Здравствуйте.Чёткого ответа на просторах интернета не нашёл , поэтому пишу сюда. Есть класс, нужен динамический массив объектов этого класса .Как реализовать , учитывая , что для каждого экземпляра... http://www.cyberforum.ru/cpp-beginners/thread733046.html
QSort для строк C++
Работает не верно. Нельзя использовать стркутуры, классы. void SAlphabetSort(char* String, int iLo, int iHi) //Алгоритм Хоара { //границы подмножества int Lo = iLo; int Hi = iHi; ...
C++ Ошибка LINK
error LNK1123: failure during conversion to COFF: file invalid or corrupt Не знаю из-за чего такая ошибка может быть, пытался скомпилить 2 проекта один из них 100% рабочий и на обеих этапах...
C++ Где скачать Borlan С++ http://www.cyberforum.ru/cpp-beginners/thread733006.html
Начал изучать системное программирование. Дали на паре решить задачу дома,уже второй день роюсь не могу найти где скачать Borlan С++ на windows7-64bit. Кто сможет скиньте ссылку! Заранее спасибо!!!
C++ Источники информации Я интересуюсь Java и знаю, что есть хорошие сообщества, которые предоставляют интересный материал, например такие как jug.ru. Вопрос: какие похожие сообщества есть у C++ разработчиков? подробнее

Показать сообщение отдельно
ZiminAS1990
2 / 2 / 0
Регистрация: 27.07.2012
Сообщений: 31

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

15.12.2012, 22:30. Просмотров 294. Ответов 2
Метки (Все метки)

Доброе время суток, уважаемые форумчане!

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

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

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

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

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

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

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

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

Благодарю за ответы
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.