Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проектирование многопоточного кода 
V
    Опции темы
boostcoder
Дата 6.6.2011, 13:20 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



всем доброго дня.

диалог с самим собой:
- класс содержит вектор доступ к которому производится из нескольких потоков.
- значит пишем обертку на вектором дабы не разбрасывать блокировки по коду.
- написал.
- о! эту переменную-член тоже нужно защитить!
- защитил.
- гм.. так для всего этого достаточно одного мьютекса. выкидываем обертку %)
- епс! блокировки разбросаны по всему коду! завтра уже не вспомню эту мозговыворачивающую логику/порядок блокировок! - убить весь код и начинать заново! %)
- ага! тут же еще и map нужно блокировать с частичной зависимостью от логики блокировки вектора и этой переменной! %)
- так по какому же принципу, и на основании чего, все это дело проектируется?! наверное, нужно обобщать фрагменты кода имеющие общие правила/логику/порядок блокировки...
- епс, один класс состоит из трех! два из которых ссылаются на один мьютекс! всего мьютексов два. - еще более мозговыворачивающая логика получилась!!!

порекомендуйте литературу/статьи по проектированию многопоточного кода.
спасибо.


Это сообщение отредактировал(а) boostcoder - 7.6.2011, 12:11
PM WWW   Вверх
azesmcar
Дата 6.6.2011, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



boostcoder

Цитата(boostcoder @  6.6.2011,  13:20 Найти цитируемый пост)
завтра уже не вспомню эту мозговыворачивающую логику/порядок блокировок! 

Многопоточный код простым бывает редко, не забывай подробно комментировать код.

А порядок блокировки всегда должен быть один и тот же. Если не уверен или не можешь это обеспечить - используй boost/std::lock().

Добавлено через 4 минуты и 4 секунды
Цитата(boostcoder @  6.6.2011,  13:20 Найти цитируемый пост)
- значит пишем обертку на вектором дабы не разбрасывать блокировки по коду.
- написал.
- о! эту переменную-член тоже нужно защитить!

Зачем нужна обертка? если это вектор - член класса, то вся синхринизации работы с вектором может быть скрыта в самом классе.
PM   Вверх
boostcoder
Дата 6.6.2011, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(azesmcar @  6.6.2011,  13:32 Найти цитируемый пост)
Зачем нужна обертка? если это вектор - член класса, то вся синхринизации работы с вектором может быть скрыта в самом классе

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

Добавлено через 5 минут и 20 секунд
Цитата(azesmcar @  6.6.2011,  13:32 Найти цитируемый пост)
А порядок блокировки всегда должен быть один и тот же. Если не уверен или не можешь это обеспечить - используй boost/std::lock().

имел ввиду, логику взаимодействия блокировок, с блокировками других членов класса. и тут начинается самое интересное, т.е. расползание спаггети %)
PM WWW   Вверх
bsa
Дата 6.6.2011, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



boostcoder, блокируй доступ к каждому объекту и все. Естественно, что публичные методы в этом случае не имеют права вызывать друг друга - только приватные. В принципе, обычные мьютексы почти бесплатные. Поэтому, лишние не сильно пессимизируют код.
PM   Вверх
boostcoder
Дата 6.6.2011, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(bsa @  6.6.2011,  15:49 Найти цитируемый пост)
блокируй доступ к каждому объекту и все

не-не-не! такого делать нельзя. есть взаимные блокировки, а есть взаимоисключающие.

Добавлено @ 16:08
к тому же, если сделать так как Вы предложили, то некоторая часть методов класса(хотя, по идее все), при вызове, будет доступна только одному потоку. а ситуация которую описал я выше, требует чтоб часть методов могла работать с одним потоком, другая же часть - с другим потоком. одновременно! иначе бы мне потребовался только один мьютекс, и вопроса подобного бы не возникло...

Это сообщение отредактировал(а) boostcoder - 6.6.2011, 16:09
PM WWW   Вверх
xvr
Дата 6.6.2011, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



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

PM MAIL   Вверх
boostcoder
Дата 6.6.2011, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



xvr, я почти так и делаю..
Цитата(boostcoder @  6.6.2011,  13:20 Найти цитируемый пост)
дин класс состоит из трех! два из которых ссылаются на один мьютекс! всего мьютексов два.

что-то вроде прокси и получилось... но как-то через попу...

Добавлено через 1 минуту и 28 секунд
вопрос-то был о внятных книжках/статьях по проектированию многопоточного кода.
PM WWW   Вверх
azesmcar
Дата 6.6.2011, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(boostcoder @  6.6.2011,  16:45 Найти цитируемый пост)
вопрос-то был о внятных книжках/статьях по проектированию многопоточного кода. 

http://www.amazon.com/Patterns-Parallel-Pr.../ref=pd_sim_b_5
http://www.amazon.com/Patterns-Parallel-So...mp;sr=8-2-spell

PM   Вверх
boostcoder
Дата 6.6.2011, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(azesmcar @  6.6.2011,  19:49 Найти цитируемый пост)
http://www.amazon.com/Patterns-Parallel-Pr.../ref=pd_sim_b_5

вот за это спасибо!
думаю вторая пока подождет.
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0515 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.