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

Поиск:

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


Опытный
**


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

Репутация: 1
Всего: 4



Вот знакомый подкинул задачку. Интересную. Как подступиться - хз, может среди форумчан кто подскажет smile

Есть класс, у него один член X (для определенности - типа int). Есть сеттер setX и геттер getX. Они вызываются из различных потоков, притом геттер вызывается намного чаще сеттера. Вопрос - как наиболее эффективно реализовать класс?

Первое, что приходит на ум - использовать мьютекс, но тогда при его блокировке одним потоком будут простаивать все остальные потоки (а их может быть МНОГО). Так что такой вариант не годится. Нужно то ли как-то закэшировать значение X для того, чтобы его могли использовать геттеры... то ли хз.

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


pattern`щик
****


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

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



Цитата(afiskon @  6.6.2011,  20:20 Найти цитируемый пост)
Что скажете?

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


Эксперт
***


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

Репутация: 8
Всего: 37



Целые числа читаются и пишутся атомарно и мьютекс не нужен. Может X  не int все-таки? Для сложного X  что-то лучше мьютекса придумать думаю будет сложно. Закэшированное значение тоже обновлять придется и не атомарно.
PM MAIL ICQ   Вверх
azesmcar
Дата 6.6.2011, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



атомарные операции.

Добавлено через 25 секунд
Цитата(Sartorius @  6.6.2011,  20:36 Найти цитируемый пост)
Целые числа читаются и пишутся атомарно и мьютекс не нужен. 

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


pattern`щик
****


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

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



Цитата(afiskon @  6.6.2011,  20:20 Найти цитируемый пост)
закэшировать значение X

в таком случае оно будет иметь ТОЛЬКО значение до того как произошел вызов setX.

или использовать атомарный тип. ибо расходы на много меньше расходов чем при блокировке мьютекса.

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


uploading...
****


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

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



Цитата(boostcoder @  6.6.2011,  20:34 Найти цитируемый пост)
использовать shared_mutex. 

для записи/чтения обыкновенного целочисленного типа? а чем atomic_store и atomic_load не угодил?
PM   Вверх
boostcoder
Дата 6.6.2011, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(Sartorius @  6.6.2011,  20:36 Найти цитируемый пост)
Целые числа читаются и пишутся атомарно и мьютекс не нужен

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


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 28.7.2006

Репутация: 1
Всего: 8



Если int - то он и читаться, и писаться будет одной "атомарной" операцией (одной процессорной командой чтения или записи). Поэтому нах всякие синхронизации - геттер всегда прочитает адекватное значение, а если сеттер вызывается из разных потоков - то сама операционка и отсинхронизирует последовательность изменений значения разнопоточными сеттерами.

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


pattern`щик
****


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

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



Цитата(azesmcar @  6.6.2011,  20:37 Найти цитируемый пост)
для записи/чтения обыкновенного целочисленного типа? а чем atomic_store и atomic_load не угодил?

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


uploading...
****


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

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



Цитата(Sartorius @  6.6.2011,  20:36 Найти цитируемый пост)
Для сложного X  что-то лучше мьютекса придумать думаю будет сложно.

учитывая, что 
Цитата(afiskon @  6.6.2011,  20:20 Найти цитируемый пост)
геттер вызывается намного чаще сеттера

для сложного X уже давно придумали compare-and-swap указателя, правда придется попотеть над очисткой памяти.

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


pattern`щик
****


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

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



ужос, сколько в тему народа повалило smile 

Добавлено через 52 секунды
Цитата(VictorTsaregorodtsev @  6.6.2011,  20:38 Найти цитируемый пост)
Если int - то он и читаться, и писаться будет одной "атомарной" операцией (одной процессорной командой чтения или записи).

траске! smile 
откуда такая информация?!
PM WWW   Вверх
azesmcar
Дата 6.6.2011, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(VictorTsaregorodtsev @  6.6.2011,  20:38 Найти цитируемый пост)
Вероятность, что при многоядерном процессоре два или более параллельных потоков будут абсолютно одновременно вызывать сеттеры - принимаем как нулевую.

с чего это вдруг? smile 
PM   Вверх
afiskon
Дата 6.6.2011, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 1
Всего: 4



Цитата

Целые числа читаются и пишутся атомарно и мьютекс не нужен

Компилятор имеел полное право реализовать операцию чтения, как какой-нибудь push, _x_ / pop eax - вот и нет никакой атомарности. Я бы не советовал сильно на это рассчитывать. Но в C++0x есть шаблоны, _гарантирующие_ гатомарность операции. Только вы уверены, что это поможет на двухъядерном процессоре?

Цитата

использовать shared_mutex.

Кажется, я где-то видел что-то похожее. Называлось типа RWLock. Интересно, а как оно реализуется?
PM MAIL WWW   Вверх
Sartorius
Дата 6.6.2011, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 8
Всего: 37



Цитата(boostcoder @  6.6.2011,  21:39 Найти цитируемый пост)
откуда такая информация?! 

Потому что в шину помещается. Как я понял, int тут для примера. Так что можно забить на это
PM MAIL ICQ   Вверх
afiskon
Дата 6.6.2011, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 1
Всего: 4



Цитата

уже давно придумали compare-and-swap указателя,

Где про это почитать?
Цитата

ужос, сколько в тему народа повалило 

Народ любит хитрые задачки smile
PM MAIL 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.0585 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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