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

С++ для начинающих

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

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

16.08.2013, 21:32. Просмотров 1395. Ответов 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++
Здравствуйте! Пожалуйста посоветуйте литературу или какие либо статьи для изучение многопоточных приложений где расписано все подробно....

Многопоточность - C++
Как создать 2 функции. Главную и второстепенную. Чтобы в определенный момент из главной в второстепенную было передано число и дальше 2...

C++ и Многопоточность. - C++
Всем привет. Написал код с использованием Curl для авторизации в вконтакте (могу скинуть код). Аккаунты для авторизации берутся из...

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DU
1483 / 1059 / 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 минуты
хм. теперь непонятно, как там атомарность доступа достигается. если бы внутри инстанса какой-то лок стоял, то после выхода из функции, его бы разлочило. хз как там это достигается. забудьте про все, что я написал
2
Убежденный
Системный программист
Эксперт С++
15550 / 7058 / 1114
Регистрация: 02.05.2013
Сообщений: 11,468
Завершенные тесты: 1
16.08.2013, 22:57 #3
Цитата Сообщение от kvadro Посмотреть сообщение
Является ли данная реализация правильной?
А можно ли ответить на этот вопрос, не видя (или не зная) остального кода ?

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

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

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

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

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

2. Что посоветуете почитать по C++.
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
17.08.2013, 18:44 #13
Цитата Сообщение от kvadro Посмотреть сообщение
зачем все усложняют себе жизнь если и так всё будет работать? Вероятно, что есть причины...
Некоторые компиляторы не полноценно поддерживают стандарты С++11, вероятно что это одна из причин.
Цитата Сообщение от kvadro Посмотреть сообщение
2. Что посоветуете почитать по C++.
Почитай книгу.
0
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
17.08.2013, 18:47  [ТС] #14
Почитай книгу.
Какие Вы остроумные.
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
17.08.2013, 18:52 #15
Цитата Сообщение от kvadro Посмотреть сообщение
Какие Вы остроумные.
Я тут один.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.08.2013, 18:52
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
17.08.2013, 18:52
Ответ Создать тему
Опции темы

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