Форум программистов, компьютерный форум CyberForum.ru

Многопоточность - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
16.08.2013, 21:32     Многопоточность #1
Всем привет, заметил в одном проекте подобный код:

C++
1
2
3
4
5
6
7
8
9
struct Counter
{
    int i;
}
 
#define g_counter ACE_Singleton< Counter, ACE_Thread_Mutex >::instance()
 
// Из нескольких потоков
g_counter->i++;
Является ли данная реализация правильной?

По идеи ведь на instance вообще нет смысла вешать mutex - чтение атомарно.
В свою очередь свойство `i`, как раз и должно было завернуто в mutex.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.08.2013, 21:32     Многопоточность
Посмотрите здесь:

C++ Многопоточность
C++ C++ и Многопоточность.
C++ Многопоточность
C++ Многопоточность
C++ Многопоточность
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
16.08.2013, 22:41     Многопоточность #2
не знамом с ACE, но тут все выглядит корректным.
могу предположить, что инстанс возвращает некий объект X, у которого перегружен оператор ->
и который на время своего существования лочит свой внутренний мьютекс и гарантирует тем самым
синхронизацию доступа к объекту Counter.
Не просто так в создали структуру Counter. По другому такой синтаксис заюзать не получится. Скажем не выйдет
параметризировать шаблон ACE_Singleton<int, ACE_Thread_Mutex> из-за особенностей оператора ->

Добавлено через 5 минут
Посмотрел доку. вроде возвращается голый указатель. и вроде можно параметризировать интом. но все равно все корректно. автор значит хотел синхронизировать доступ к целому объекту Counter а не к какому-то его отдельному полю, если бы их было несколько.

Добавлено через 2 минуты
хм. теперь непонятно, как там атомарность доступа достигается. если бы внутри инстанса какой-то лок стоял, то после выхода из функции, его бы разлочило. хз как там это достигается. забудьте про все, что я написал
Убежденный
Системный программист
 Аватар для Убежденный
14212 / 6227 / 988
Регистрация: 02.05.2013
Сообщений: 10,385
Завершенные тесты: 1
16.08.2013, 22:57     Многопоточность #3
Цитата Сообщение от kvadro Посмотреть сообщение
Является ли данная реализация правильной?
А можно ли ответить на этот вопрос, не видя (или не зная) остального кода ?

Цитата Сообщение от kvadro Посмотреть сообщение
По идеи ведь на instance вообще нет смысла вешать mutex - чтение атомарно.
На синглтон вешается mutex, чтобы защититься от гонок при его инициализации.
Атомарность или неатомарность чтения здесь не при чем.

Цитата Сообщение от kvadro Посмотреть сообщение
В свою очередь свойство `i`, как раз и должно было завернуто в mutex.
Это да, потому что атомарность оператора инкремента не гарантируется.
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
17.08.2013, 17:32  [ТС]     Многопоточность #4
На синглтон вешается mutex, чтобы защититься от гонок при его инициализации.
Я просто неудачный пример привёл, сейчас покажу что хотел сказать.

А можно ли ответить на этот вопрос, не видя (или не зная) остального кода ?
Собственно класс World:
https://github.com/TrinityCore/Trini.../World/World.h

Основной поток:
https://github.com/TrinityCore/Trini...ver/Master.cpp

Вторичный поток:
https://github.com/TrinityCore/Trini...ldRunnable.cpp

Инициализация класса World всегда идёт в основном потоке до создания вторичного. Из-за этого непонятно зачем на синглтон вешать mutex.

В свою очередь свойство `i`, как раз и должно было завернуто в mutex.
Этот вопрос был задан чтоб убедится что я хоть немного понимаю принцип работы с потоками

Добавлено через 16 часов 58 минут
Убежденный
А не подскажите сразу, почему в C++ синглтон Майерса является потокобезопасным?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class OnlyOne
{
public:
        static const OnlyOne& Instance()
        {
                static OnlyOne theSingleInstance;
                return theSingleInstance;
        }
private:        
        OnlyOne(){};
        OnlyOne(const OnlyOne& root);
        OnlyOne& operator=(const OnlyOne&);
};
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
17.08.2013, 17:36     Многопоточность #5
в новом стандарте есть какой-то пункт о том, что статические объекты инициализируются потокобезопастно.
но это только инициализации касается.
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
17.08.2013, 17:52  [ТС]     Многопоточность #6
If control enters the declaration concurrently while the variable is being initialized, the concurrent execution shall wait for completion of the initialization.
Ага, вот вычитал.

но это только инициализации касается.
Ну собственно чтение будет атомарно, Убежденный вчера говорил что mutex нужен только от гонок инициализации, так что, как я понял, теперь в многопоточном приложении можно использовать обычный синглтон, а компилятор всё сделает за нас?

Ну и стоит ли доверять компилятору?
Убежденный
Системный программист
 Аватар для Убежденный
14212 / 6227 / 988
Регистрация: 02.05.2013
Сообщений: 10,385
Завершенные тесты: 1
17.08.2013, 17:57     Многопоточность #7
Цитата Сообщение от kvadro Посмотреть сообщение
почему в C++ синглтон Майерса является потокобезопасным?
В C++ 98/03 не является.

Цитата Сообщение от kvadro Посмотреть сообщение
Убежденный вчера говорил что mutex нужен только от гонок инициализации, так что, как я понял, теперь в многопоточном приложении можно использовать обычный синглтон?
Его и раньше можно было использовать. При условии, что инициализация потокобезопасна.
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
17.08.2013, 18:08  [ТС]     Многопоточность #8
Его и раньше можно было использовать. При условии, что инициализация потокобезопасна.
Ну в коде выше, например, можно было и не использовать mutex?
Убежденный
Системный программист
 Аватар для Убежденный
14212 / 6227 / 988
Регистрация: 02.05.2013
Сообщений: 10,385
Завершенные тесты: 1
17.08.2013, 18:12     Многопоточность #9
В каком именно коде ?
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
17.08.2013, 18:14  [ТС]     Многопоточность #10
Многопоточность
Убежденный
Системный программист
 Аватар для Убежденный
14212 / 6227 / 988
Регистрация: 02.05.2013
Сообщений: 10,385
Завершенные тесты: 1
17.08.2013, 18:19     Многопоточность #11
Если первое обращение к синглтону свободно от гонок, то мьютекс не нужен.
Кстати, там его и нет, т.к. ACE_Null_Mutex - это "заглушка".
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
17.08.2013, 18:24  [ТС]     Многопоточность #12
Ещё вопросики)

1. В C++11 синглтон Майерса является потокобезопасным, понятное дело что его потокобезопасность обеспечивает компилятор, и некоторые программисты всё-равно используют старые методы для подстраховки, с другой стороны на иностранных ресурсах всё-равно советуют использовать синглтон на базе std::call_once, возникает вопрос - зачем все усложняют себе жизнь если и так всё будет работать? Вероятно, что есть причины...

2. Что посоветуете почитать по C++.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
17.08.2013, 18:44     Многопоточность #13
Цитата Сообщение от kvadro Посмотреть сообщение
зачем все усложняют себе жизнь если и так всё будет работать? Вероятно, что есть причины...
Некоторые компиляторы не полноценно поддерживают стандарты С++11, вероятно что это одна из причин.
Цитата Сообщение от kvadro Посмотреть сообщение
2. Что посоветуете почитать по C++.
Почитай книгу.
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
17.08.2013, 18:47  [ТС]     Многопоточность #14
Почитай книгу.
Какие Вы остроумные.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
17.08.2013, 18:52     Многопоточность #15
Цитата Сообщение от kvadro Посмотреть сообщение
Какие Вы остроумные.
Я тут один.
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
17.08.2013, 18:53  [ТС]     Многопоточность #16
castaway
Обратите внимание на то, что "Вы" было написано с большой.
Убежденный
Системный программист
 Аватар для Убежденный
14212 / 6227 / 988
Регистрация: 02.05.2013
Сообщений: 10,385
Завершенные тесты: 1
17.08.2013, 18:54     Многопоточность #17
Цитата Сообщение от kvadro Посмотреть сообщение
некоторые программисты всё-равно используют старые методы для подстраховки, с другой стороны на иностранных ресурсах всё-равно советуют использовать синглтон на базе std::call_once, возникает вопрос - зачем все усложняют себе жизнь если и так всё будет работать? Вероятно, что есть причины...
static, call_once и всякие самопальные решения - это не одно и то же.
Одни выигрывают в простоте, другие в переносимости, третьи в эффективности и т.д.
Я вот сейчас ради интереса прошелся отладчиком по реализации call_once в VC++ 2012 -
это же натурально дикий ужас: какие-то критические секции, планирование потоков, TLS и т.п.
В то же время можно написать почти эквивалентную реализацию на одном интерлоке +
однократной wait-функции...
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
17.08.2013, 18:55     Многопоточность #18
Цитата Сообщение от kvadro Посмотреть сообщение
Обратите внимание на то, что "Вы" было написано с большой.
Обратите внимание на слова "Какие" и "остроумные".
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.08.2013, 18:58     Многопоточность #19
Цитата Сообщение от kvadro Посмотреть сообщение
Что посоветуете почитать по C++
Литература C++
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.08.2013, 19:07     Многопоточность
Еще ссылки по теме:

Многопоточность C++
C++ 11 многопоточность C++
Многопоточность C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
magirus
17.08.2013, 19:07     Многопоточность
  #20
 Комментарий администратора 
castaway, флуд прекратите.
Yandex
Объявления
17.08.2013, 19:07     Многопоточность
Ответ Создать тему
Опции темы

Текущее время: 19:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru