12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
1

Многопоточность

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

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

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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.08.2013, 21:32
Ответы с готовыми решениями:

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

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

Многопоточность С++
Добрый вечер! написал вот такую программку. std::vector&lt;std::thread&gt; threads;...

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

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

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

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

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

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

Вторичный поток:
https://github.com/TrinityCore... nnable.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
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
If control enters the declaration concurrently while the variable is being initialized, the concurrent execution shall wait for completion of the initialization.
Ага, вот вычитал.

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

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

Цитата Сообщение от kvadro Посмотреть сообщение
Убежденный вчера говорил что mutex нужен только от гонок инициализации, так что, как я понял, теперь в многопоточном приложении можно использовать обычный синглтон?
Его и раньше можно было использовать. При условии, что инициализация потокобезопасна.
1
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
17.08.2013, 18:08  [ТС] 8
Его и раньше можно было использовать. При условии, что инициализация потокобезопасна.
Ну в коде выше, например, можно было и не использовать mutex?
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
17.08.2013, 18:12 9
В каком именно коде ?
0
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
17.08.2013, 18:14  [ТС] 10
Многопоточность
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
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
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
17.08.2013, 18:44 13
Цитата Сообщение от kvadro Посмотреть сообщение
зачем все усложняют себе жизнь если и так всё будет работать? Вероятно, что есть причины...
Некоторые компиляторы не полноценно поддерживают стандарты С++11, вероятно что это одна из причин.
Цитата Сообщение от kvadro Посмотреть сообщение
2. Что посоветуете почитать по C++.
Почитай книгу.
0
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
17.08.2013, 18:47  [ТС] 14
Почитай книгу.
Какие Вы остроумные.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
17.08.2013, 18:52 15
Цитата Сообщение от kvadro Посмотреть сообщение
Какие Вы остроумные.
Я тут один.
0
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
17.08.2013, 18:53  [ТС] 16
castaway
Обратите внимание на то, что "Вы" было написано с большой.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
17.08.2013, 18:54 17
Цитата Сообщение от kvadro Посмотреть сообщение
некоторые программисты всё-равно используют старые методы для подстраховки, с другой стороны на иностранных ресурсах всё-равно советуют использовать синглтон на базе std::call_once, возникает вопрос - зачем все усложняют себе жизнь если и так всё будет работать? Вероятно, что есть причины...
static, call_once и всякие самопальные решения - это не одно и то же.
Одни выигрывают в простоте, другие в переносимости, третьи в эффективности и т.д.
Я вот сейчас ради интереса прошелся отладчиком по реализации call_once в VC++ 2012 -
это же натурально дикий ужас: какие-то критические секции, планирование потоков, TLS и т.п.
В то же время можно написать почти эквивалентную реализацию на одном интерлоке +
однократной wait-функции...
1
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
17.08.2013, 18:55 18
Цитата Сообщение от kvadro Посмотреть сообщение
Обратите внимание на то, что "Вы" было написано с большой.
Обратите внимание на слова "Какие" и "остроумные".
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
17.08.2013, 18:58 19
Цитата Сообщение от kvadro Посмотреть сообщение
Что посоветуете почитать по C++
Литература C++
1
magirus
17.08.2013, 19:07     Многопоточность
  #20
 Комментарий администратора 
castaway, флуд прекратите.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.08.2013, 19:07

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru