![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
Меня уже давно ломает то, как приходится работать с общими данными в многопоточных программах на С++
Использование lock-ов ломает модульность, классический пример: у нас есть класс - хэш таблица, которую можно безопасно использовать в многопоточных программах. Но если у нас есть 2 такие таблицы и нам нужно взять элемент из одной и вставить в другую, то другой поток может обратиться к таблицам между этими операциями и не найти этот элемент ни в одной из таблиц. В некоторых случаях это будет проблемой. У меня появилась идея как это побороть, но видимо не очень удачная. Принцип работы такой. Доступ к объекту производится не на прямую, а через proxy объект, который создается на стеке и во время создания блокирует объект которым владеет. Если создать несколько таких accessor-ов, то можно работать с ними атомарно(если конечно методы lock и unlock объектов правильно реализованы). Если все методы будут вызываться не на прямую а через accessor-ы то с одним объектом можно работать безопасно из разных потоков не опасаясь race-ов. Вот код:
при таком подходе, производительность будет такой-же как и при традиционном подходе (как если-бы я просто добавил методы accessor-ы в класс Foo и вызывал-бы там методы lock - unlock). Но этот подход не избавляет от возможности возникновения deadlock-ов, так-как 2 разных потока могут попытаться залочить пару объектов но в разном порядке, то-есть код использующий 2 и более accessor-a все равно нуждается в синхронизации. Как это можно побороть? Есть-ли какие либо техники организации порядка блокировок в таком случае? |
|||
|
||||
| Vaulter |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1724 Регистрация: 30.12.2002 Где: бункер Репутация: 2 Всего: 22 |
Семафоры?
|
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
нет я думал о каком-нибудь механизме, вроде composed transactional memory, но только на уровне архитектуры, видимо я хочу странного =) |
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
Если не семафоры, то что? Или я чего-то не понимаю...?
-------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
или
|
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
Спасибо за информативность... -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |