Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
kvadro
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
#1

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

16.08.2013, 21:32. Просмотров 1500. Ответов 22
Метки нет (Все метки)

Всем привет, заметил в одном проекте подобный код:

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.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.08.2013, 21:32
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Многопоточность (C++):

Многопоточность в C++ и C++11
как я понял, многопоточность появилась в С++11 cтандарте. Почитал что его вроде...

Многопоточность
Не особо понимаю мнопоточность в с++. Есть задание типа.... Сделать программу,...

C++ 11 многопоточность
Всем привет!!!Я пытаюсь сделать , подобие прогресс -бара, и столкнулся с...

Многопоточность
Есть задание: Написать и протестировать функцию, которая находит в массиве...

Многопоточность
При добавлении больше 10000 элементов в таблицу на форму форма зависает, как...

Многопоточность
Здраствуйте! Объясните пожалуйста понятными словами что такое многопоточность и...

22
DU
1486 / 1132 / 164
Регистрация: 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
Убежденный
Ушел с форума
Эксперт С++
15941 / 7252 / 1176
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
16.08.2013, 22:57 #3
Цитата Сообщение от kvadro Посмотреть сообщение
Является ли данная реализация правильной?
А можно ли ответить на этот вопрос, не видя (или не зная) остального кода ?

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

Цитата Сообщение от kvadro Посмотреть сообщение
В свою очередь свойство `i`, как раз и должно было завернуто в mutex.
Это да, потому что атомарность оператора инкремента не гарантируется.
2
kvadro
12 / 10 / 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&);
};
0
DU
1486 / 1132 / 164
Регистрация: 05.12.2011
Сообщений: 2,279
17.08.2013, 17:36 #5
в новом стандарте есть какой-то пункт о том, что статические объекты инициализируются потокобезопастно.
но это только инициализации касается.
1
kvadro
12 / 10 / 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 нужен только от гонок инициализации, так что, как я понял, теперь в многопоточном приложении можно использовать обычный синглтон, а компилятор всё сделает за нас?

Ну и стоит ли доверять компилятору?
0
Убежденный
Ушел с форума
Эксперт С++
15941 / 7252 / 1176
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
17.08.2013, 17:57 #7
Цитата Сообщение от kvadro Посмотреть сообщение
почему в C++ синглтон Майерса является потокобезопасным?
В C++ 98/03 не является.

Цитата Сообщение от kvadro Посмотреть сообщение
Убежденный вчера говорил что mutex нужен только от гонок инициализации, так что, как я понял, теперь в многопоточном приложении можно использовать обычный синглтон?
Его и раньше можно было использовать. При условии, что инициализация потокобезопасна.
1
kvadro
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
17.08.2013, 18:08  [ТС] #8
Его и раньше можно было использовать. При условии, что инициализация потокобезопасна.
Ну в коде выше, например, можно было и не использовать mutex?
0
Убежденный
Ушел с форума
Эксперт С++
15941 / 7252 / 1176
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
17.08.2013, 18:12 #9
В каком именно коде ?
0
kvadro
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
17.08.2013, 18:14  [ТС] #10
http://www.cyberforum.ru/cpp-beginners/thread939134.html#post4957080
0
Убежденный
Ушел с форума
Эксперт С++
15941 / 7252 / 1176
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
17.08.2013, 18:19 #11
Если первое обращение к синглтону свободно от гонок, то мьютекс не нужен.
Кстати, там его и нет, т.к. ACE_Null_Mutex - это "заглушка".
1
kvadro
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
17.08.2013, 18:24  [ТС] #12
Ещё вопросики)

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

2. Что посоветуете почитать по C++.
0
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
17.08.2013, 18:44 #13
Цитата Сообщение от kvadro Посмотреть сообщение
зачем все усложняют себе жизнь если и так всё будет работать? Вероятно, что есть причины...
Некоторые компиляторы не полноценно поддерживают стандарты С++11, вероятно что это одна из причин.
Цитата Сообщение от kvadro Посмотреть сообщение
2. Что посоветуете почитать по C++.
Почитай книгу.
0
kvadro
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
17.08.2013, 18:47  [ТС] #14
Почитай книгу.
Какие Вы остроумные.
0
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
17.08.2013, 18:52 #15
Цитата Сообщение от kvadro Посмотреть сообщение
Какие Вы остроумные.
Я тут один.
0
kvadro
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
17.08.2013, 18:53  [ТС] #16
castaway
Обратите внимание на то, что "Вы" было написано с большой.
0
Убежденный
Ушел с форума
Эксперт С++
15941 / 7252 / 1176
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
17.08.2013, 18:54 #17
Цитата Сообщение от kvadro Посмотреть сообщение
некоторые программисты всё-равно используют старые методы для подстраховки, с другой стороны на иностранных ресурсах всё-равно советуют использовать синглтон на базе std::call_once, возникает вопрос - зачем все усложняют себе жизнь если и так всё будет работать? Вероятно, что есть причины...
static, call_once и всякие самопальные решения - это не одно и то же.
Одни выигрывают в простоте, другие в переносимости, третьи в эффективности и т.д.
Я вот сейчас ради интереса прошелся отладчиком по реализации call_once в VC++ 2012 -
это же натурально дикий ужас: какие-то критические секции, планирование потоков, TLS и т.п.
В то же время можно написать почти эквивалентную реализацию на одном интерлоке +
однократной wait-функции...
1
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
17.08.2013, 18:55 #18
Цитата Сообщение от kvadro Посмотреть сообщение
Обратите внимание на то, что "Вы" было написано с большой.
Обратите внимание на слова "Какие" и "остроумные".
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.08.2013, 18:58 #19
Цитата Сообщение от kvadro Посмотреть сообщение
Что посоветуете почитать по C++
http://www.cyberforum.ru/cpp-beginners/thread152353.html#post1993739
1
magirus
17.08.2013, 19:07     Многопоточность
  #20
 Комментарий администратора 
castaway, флуд прекратите.
1
17.08.2013, 19:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.08.2013, 19:07
Привет! Вот еще темы с ответами:

Многопоточность
Здравствуйте уважаемые форумчане! Суть проблемы такова, в нижней задаче есть...

Многопоточность
Здравствуйте! Пожалуйста посоветуйте литературу или какие либо статьи для...

Многопоточность в С++
Добрый день! Если я создам экземпляр класса в одном потоке и начну...

Многопоточность
Подскажите пожалуйста, в чем собственно проблема? Если применить...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru