12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
|
||||||
1 | ||||||
Многопоточность16.08.2013, 21:32. Показов 2665. Ответов 22
Метки нет (Все метки)
Всем привет, заметил в одном проекте подобный код:
По идеи ведь на instance вообще нет смысла вешать mutex - чтение атомарно. В свою очередь свойство `i`, как раз и должно было завернуто в mutex.
0
|
16.08.2013, 21:32 | |
Ответы с готовыми решениями:
22
Многопоточность в C++ и C++11 Многопоточность Многопоточность С++ Многопоточность c++ |
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
16.08.2013, 22:41 | 2 |
не знамом с ACE, но тут все выглядит корректным.
могу предположить, что инстанс возвращает некий объект X, у которого перегружен оператор -> и который на время своего существования лочит свой внутренний мьютекс и гарантирует тем самым синхронизацию доступа к объекту Counter. Не просто так в создали структуру Counter. По другому такой синтаксис заюзать не получится. Скажем не выйдет параметризировать шаблон ACE_Singleton<int, ACE_Thread_Mutex> из-за особенностей оператора -> Добавлено через 5 минут Посмотрел доку. вроде возвращается голый указатель. и вроде можно параметризировать интом. но все равно все корректно. автор значит хотел синхронизировать доступ к целому объекту Counter а не к какому-то его отдельному полю, если бы их было несколько. Добавлено через 2 минуты хм. теперь непонятно, как там атомарность доступа достигается. если бы внутри инстанса какой-то лок стоял, то после выхода из функции, его бы разлочило. хз как там это достигается. забудьте про все, что я написал
2
|
Ушел с форума
|
|
16.08.2013, 22:57 | 3 |
А можно ли ответить на этот вопрос, не видя (или не зная) остального кода ?
На синглтон вешается mutex, чтобы защититься от гонок при его инициализации. Атомарность или неатомарность чтения здесь не при чем. Это да, потому что атомарность оператора инкремента не гарантируется.
2
|
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
|
||||||
17.08.2013, 17:32 [ТС] | 4 | |||||
https://github.com/TrinityCore... ld/World.h Основной поток: https://github.com/TrinityCore... Master.cpp Вторичный поток: https://github.com/TrinityCore... nnable.cpp Инициализация класса World всегда идёт в основном потоке до создания вторичного. Из-за этого непонятно зачем на синглтон вешать mutex. Добавлено через 16 часов 58 минут Убежденный А не подскажите сразу, почему в C++ синглтон Майерса является потокобезопасным?
0
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
17.08.2013, 17:36 | 5 |
в новом стандарте есть какой-то пункт о том, что статические объекты инициализируются потокобезопастно.
но это только инициализации касается.
1
|
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
|
|
17.08.2013, 17:52 [ТС] | 6 |
Ну и стоит ли доверять компилятору?
0
|
Ушел с форума
|
|
17.08.2013, 17:57 | 7 |
В C++ 98/03 не является.
Его и раньше можно было использовать. При условии, что инициализация потокобезопасна.
1
|
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
|
|
17.08.2013, 18:08 [ТС] | 8 |
0
|
Ушел с форума
|
|
17.08.2013, 18:12 | 9 |
В каком именно коде ?
0
|
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
|
|
17.08.2013, 18:14 [ТС] | 10 |
0
|
Ушел с форума
|
|
17.08.2013, 18:19 | 11 |
Если первое обращение к синглтону свободно от гонок, то мьютекс не нужен.
Кстати, там его и нет, т.к. ACE_Null_Mutex - это "заглушка".
1
|
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
|
|
17.08.2013, 18:24 [ТС] | 12 |
Ещё вопросики)
1. В C++11 синглтон Майерса является потокобезопасным, понятное дело что его потокобезопасность обеспечивает компилятор, и некоторые программисты всё-равно используют старые методы для подстраховки, с другой стороны на иностранных ресурсах всё-равно советуют использовать синглтон на базе std::call_once, возникает вопрос - зачем все усложняют себе жизнь если и так всё будет работать? Вероятно, что есть причины... 2. Что посоветуете почитать по C++.
0
|
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
|
|
17.08.2013, 18:47 [ТС] | 14 |
0
|
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
|
|
17.08.2013, 18:53 [ТС] | 16 |
castaway
Обратите внимание на то, что "Вы" было написано с большой.
0
|
Ушел с форума
|
|
17.08.2013, 18:54 | 17 |
static, call_once и всякие самопальные решения - это не одно и то же.
Одни выигрывают в простоте, другие в переносимости, третьи в эффективности и т.д. Я вот сейчас ради интереса прошелся отладчиком по реализации call_once в VC++ 2012 - это же натурально дикий ужас: какие-то критические секции, планирование потоков, TLS и т.п. В то же время можно написать почти эквивалентную реализацию на одном интерлоке + однократной wait-функции...
1
|
Каратель
|
|
17.08.2013, 18:58 | 19 |
1
|
magirus
|
||||||
17.08.2013, 19:07
Многопоточность
#20
|
||||||
1
|
17.08.2013, 19:07 | |
Многопоточность Многопоточность Многопоточность в С++ Многопоточность Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |