![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| afiskon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 31.3.2011 Где: Россия, Москва Репутация: 1 Всего: 4 |
Вот знакомый подкинул задачку. Интересную. Как подступиться - хз, может среди форумчан кто подскажет
Есть класс, у него один член X (для определенности - типа int). Есть сеттер setX и геттер getX. Они вызываются из различных потоков, притом геттер вызывается намного чаще сеттера. Вопрос - как наиболее эффективно реализовать класс? Первое, что приходит на ум - использовать мьютекс, но тогда при его блокировке одним потоком будут простаивать все остальные потоки (а их может быть МНОГО). Так что такой вариант не годится. Нужно то ли как-то закэшировать значение X для того, чтобы его могли использовать геттеры... то ли хз. Что скажете? |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 8 Всего: 37 |
Целые числа читаются и пишутся атомарно и мьютекс не нужен. Может X не int все-таки? Для сложного X что-то лучше мьютекса придумать думаю будет сложно. Закэшированное значение тоже обновлять придется и не атомарно.
|
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
в таком случае оно будет иметь ТОЛЬКО значение до того как произошел вызов setX. или использовать атомарный тип. ибо расходы на много меньше расходов чем при блокировке мьютекса. |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| VictorTsaregorodtsev |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 28.7.2006 Репутация: 1 Всего: 8 |
Если int - то он и читаться, и писаться будет одной "атомарной" операцией (одной процессорной командой чтения или записи). Поэтому нах всякие синхронизации - геттер всегда прочитает адекватное значение, а если сеттер вызывается из разных потоков - то сама операционка и отсинхронизирует последовательность изменений значения разнопоточными сеттерами.
Вероятность, что при многоядерном процессоре два или более параллельных потоков будут абсолютно одновременно вызывать сеттеры - принимаем как нулевую. Тем более, что многоядерный проц должен как-то такие коллизии (по одновременной записи данных в кэш) разруливать на аппаратном уровне. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
| afiskon |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 31.3.2011 Где: Россия, Москва Репутация: 1 Всего: 4 |
Компилятор имеел полное право реализовать операцию чтения, как какой-нибудь push, _x_ / pop eax - вот и нет никакой атомарности. Я бы не советовал сильно на это рассчитывать. Но в C++0x есть шаблоны, _гарантирующие_ гатомарность операции. Только вы уверены, что это поможет на двухъядерном процессоре?
Кажется, я где-то видел что-то похожее. Называлось типа RWLock. Интересно, а как оно реализуется? |
||||
|
|||||
| Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 8 Всего: 37 |
||||
|
||||
| afiskon |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 31.3.2011 Где: Россия, Москва Репутация: 1 Всего: 4 |
Где про это почитать?
Народ любит хитрые задачки |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |