Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127

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

16.08.2013, 21:32. Показов 2943. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.08.2013, 21:32
Ответы с готовыми решениями:

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

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

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

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

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

Добавлено через 2 минуты
хм. теперь непонятно, как там атомарность доступа достигается. если бы внутри инстанса какой-то лок стоял, то после выхода из функции, его бы разлочило. хз как там это достигается. забудьте про все, что я написал
2
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
16.08.2013, 22:57
Цитата Сообщение от kvadro Посмотреть сообщение
Является ли данная реализация правильной?
А можно ли ответить на этот вопрос, не видя (или не зная) остального кода ?

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

Цитата Сообщение от kvadro Посмотреть сообщение
В свою очередь свойство `i`, как раз и должно было завернуто в mutex.
Это да, потому что атомарность оператора инкремента не гарантируется.
2
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
17.08.2013, 17:32  [ТС]
На синглтон вешается 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
в новом стандарте есть какой-то пункт о том, что статические объекты инициализируются потокобезопастно.
но это только инициализации касается.
1
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
17.08.2013, 17:52  [ТС]
If control enters the declaration concurrently while the variable is being initialized, the concurrent execution shall wait for completion of the initialization.
Ага, вот вычитал.

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

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

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

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

2. Что посоветуете почитать по C++.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
17.08.2013, 18:44
Цитата Сообщение от kvadro Посмотреть сообщение
зачем все усложняют себе жизнь если и так всё будет работать? Вероятно, что есть причины...
Некоторые компиляторы не полноценно поддерживают стандарты С++11, вероятно что это одна из причин.
Цитата Сообщение от kvadro Посмотреть сообщение
2. Что посоветуете почитать по C++.
Почитай книгу.
0
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
17.08.2013, 18:47  [ТС]
Почитай книгу.
Какие Вы остроумные.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
17.08.2013, 18:52
Цитата Сообщение от kvadro Посмотреть сообщение
Какие Вы остроумные.
Я тут один.
0
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
17.08.2013, 18:53  [ТС]
castaway
Обратите внимание на то, что "Вы" было написано с большой.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
17.08.2013, 18:54
Цитата Сообщение от kvadro Посмотреть сообщение
некоторые программисты всё-равно используют старые методы для подстраховки, с другой стороны на иностранных ресурсах всё-равно советуют использовать синглтон на базе std::call_once, возникает вопрос - зачем все усложняют себе жизнь если и так всё будет работать? Вероятно, что есть причины...
static, call_once и всякие самопальные решения - это не одно и то же.
Одни выигрывают в простоте, другие в переносимости, третьи в эффективности и т.д.
Я вот сейчас ради интереса прошелся отладчиком по реализации call_once в VC++ 2012 -
это же натурально дикий ужас: какие-то критические секции, планирование потоков, TLS и т.п.
В то же время можно написать почти эквивалентную реализацию на одном интерлоке +
однократной wait-функции...
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
17.08.2013, 18:55
Цитата Сообщение от kvadro Посмотреть сообщение
Обратите внимание на то, что "Вы" было написано с большой.
Обратите внимание на слова "Какие" и "остроумные".
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
17.08.2013, 18:58
Цитата Сообщение от kvadro Посмотреть сообщение
Что посоветуете почитать по C++
Литература C++
1
17.08.2013, 19:07
 Комментарий администратора 
castaway, флуд прекратите.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.08.2013, 19:07
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru