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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ZiminAS1990
2 / 2 / 0
Регистрация: 27.07.2012
Сообщений: 31
#1

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

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

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

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

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

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

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

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

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

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

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

Благодарю за ответы
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.12.2012, 22:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Потокозащищённые классы и их интерфейс (C++):

Непонятна тема (Классы содержащие другие классы, как данные члены ) - C++
Изучаю книгу Джесс Либерти(в частности эту главу в данный момент) #include <iostream> class Point { public: void SetX(int...

Программа по классам, которая использует классы точек и прямых на плоскости, а, возможно, и другие классы - C++
Нужно написать программу, которая использует классы точек и прямых на плоскости, а, возможно, и другие классы. Реализовать её нужно в трех...

Наследование, базовые классы и производные классы - C++
Добрый вечер.Задание: необходимо разработать поля и методы наследуемые из базового класса и собственные компоненты производных...

Классы и наследование (Создать класс 3D фигура, и производные классы шар, конус, цилиндр и куб. Создать функцию вычисления объёма.) - C++
Уважаевые, помогите написать прожку на экзамене: Создать класс 3D фигура, и производные классы шар, конус, цилиндр и куб. Создать функцию...

Классы возможностей(Mixin классы) - C++
Не могу понять смысла использования mixin классов( это класс в котором есть только методы и нет членов-данных) Т.е. к примеру у нас...

Классы, включающие другие классы - C++
Столкнулся вот с таким кодом: #include <iostream> class Point { public: void SetX(int x) {itsX = x;} void SetY(int y) ...

2
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
15.12.2012, 22:38 #2
вполне себе адекватно на мой взгляд.
только бы по умолчанию, основной класс я бы не стал загромождать потокозащищенными функциями, а сделал бы это в отдельном классе-обертке, который бы и хранил мьютекс и захватывал бы его, перед перевызовом основной функции. это не всегда может прокатить, но в случае, когда на весь класс один мьютекс - вполне себе.
1
ZiminAS1990
2 / 2 / 0
Регистрация: 27.07.2012
Сообщений: 31
15.12.2012, 23:04  [ТС] #3
Цитата Сообщение от DU Посмотреть сообщение
вполне себе адекватно на мой взгляд.
только бы по умолчанию, основной класс я бы не стал загромождать потокозащищенными функциями, а сделал бы это в отдельном классе-обертке, который бы и хранил мьютекс и захватывал бы его, перед перевызовом основной функции. это не всегда может прокатить, но в случае, когда на весь класс один мьютекс - вполне себе.
О! Класс-обёртка с мьютексом внутри - хорошая идея, спасибо
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2012, 23:04
Привет! Вот еще темы с ответами:

классы/дочерние классы/методы - C++
помогите пожалуйста! надо что выводились только учебеники. чтоб былo через GetTip. h файл class Book { protected: char...

Классы и интерфейс - PHP ООП
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace InterfaceAndClass { ...

Интерфейс и абстрактные классы - C#
После прочтения Хабро-статьи http://habrahabr.ru/post/169949/, после коммента: "Стандартные вопросы тоже не стоит оставлять без внимания....

интерфейс и наследуемые классы в отдельных List - C#
у меня есть интерфейс, в нем есть метод поиска, так как и в 2ух наследниках он обезательно есть, я бы хотел их занести в один лист, и...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

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