Russian Qt Forum
Май 05, 2024, 13:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3] 4   Вниз
  Печать  
Автор Тема: Класс настроек  (Прочитано 20321 раз)
Bepec
Гость
« Ответ #30 : Сентябрь 17, 2014, 13:48 »

Если в двух словах - gcc ставит мутекс на каждый вызов Веселый
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #31 : Сентябрь 17, 2014, 13:49 »

еще можно воспользоваться GCD и создавать синглтон в dispatch_once()
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #32 : Сентябрь 17, 2014, 13:51 »

Цитировать
to Max: приведите пример синглтона с новым стандартом пожалуйста. Мне интересно.
Код
C++ (Qt)
template <class T>
T & singleton()
{
   static T instance;
   return instance;
}
 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #33 : Сентябрь 17, 2014, 14:02 »

И что с того?
[off]Давно заметил что "тыц ссылкой" - совсем не признак ума Улыбающийся[/off]

Код
C++ (Qt)
template <class T>
T & singleton()
{
   static T instance;
   return instance;
}
 
А если в какой-то момент я захочу заменить instance, а потом вернуть старый ? (типа push/pop)
Записан
Bepec
Гость
« Ответ #34 : Сентябрь 17, 2014, 14:38 »

Ммм... Т.е. стандарт разруливает все мутексы и прочую фигню? Улыбающийся
Записан
OKTA
Гость
« Ответ #35 : Сентябрь 17, 2014, 14:48 »

Ссылка от Vizir.vs говорит и показывает, что не все компиляторы по-честному поддерживают эту тему, так что чего-то сомнительно  Смеющийся
Записан
OKTA
Гость
« Ответ #36 : Сентябрь 17, 2014, 15:56 »

Цитировать
А если в какой-то момент я захочу заменить instance, а потом вернуть старый ? (типа push/pop)

Это тонкий намек, что от мьютексов не убежать?  Смеющийся
Записан
Bepec
Гость
« Ответ #37 : Сентябрь 17, 2014, 16:24 »

Это тонкий намёк на натуру Igors - поставить задачу, а потом менять условие, не считаясь ни с какими доводами Веселый

Не хотел бы я, чтоб он был заказчиком Улыбающийся
Записан
OKTA
Гость
« Ответ #38 : Сентябрь 17, 2014, 16:28 »

Хм, что же это, все операции для чтения-установки значений в классе настроек таком тоже придется защищать мьютексами?  Смеющийся
Записан
Bepec
Гость
« Ответ #39 : Сентябрь 17, 2014, 16:49 »

новый стандарт делает просто - на каждый вызов по мутексу Веселый Видимо не тормозит Веселый
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #40 : Сентябрь 17, 2014, 16:54 »

[Не во всех комиляторах. В гцц вышеприведенный код и без всяких опций будет работать, что не означает, что он верен.
Ладно, чтобы "сердце успокоилось" исправляем

Код
C++ (Qt)
MySingle * MySingle::mInstance = 0;
static QMutex mutex;
 
MySingle * MySingle::Instance( void )
{
if (!mInstance) {
 QMutexlocker lock(&mutex);
 mInstance = new MySingle;
}
return mInstance;
}
Теперь верно ?

B снова неверно. Порядок инициализации не определён. Может статься, что вы при вызове Instance(), QMutex еще не создан.

Блин, читайте Александреску.

ЗЫ: а dlopen является thread-safe?
« Последнее редактирование: Сентябрь 17, 2014, 16:55 от Авварон » Записан
OKTA
Гость
« Ответ #41 : Сентябрь 17, 2014, 17:00 »

в этом случае QMutex сразу будет создан по причине своей статичности и нахождении в теле класса, разве нет?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #42 : Сентябрь 17, 2014, 17:03 »

Хм, что же это, все операции для чтения-установки значений в классе настроек таком тоже придется защищать мьютексами?  Смеющийся
Никто не утверждал что синглтон нельзя менять, и это может быть небезопасно если он используется неск нитками. Так что эти заботы никто не отменял. Только вот чего это я обязан объявлять static экземпляр? Как всегда указатель гибче.

Подлянка в операторе new (см. статью кстати очень неплохую). В 2 словах
Код
C++ (Qt)
mInstance = new MySingle;
Стандарт во всяком случае не запрещает установку возвращаемого значения mInstance ДО ТОГО как код конструктора полностью выполнится.

Ну так это легко обходится если чуть-чуть подумать. Но увы - желания думать нету. Пошла барахолка типа "где бы чего достать" под трескотню Верес'а  Плачущий

B снова неверно. Порядок инициализации не определён. Может статься, что вы при вызове Instance(), QMutex еще не создан.
Я даже знаю из какой (глупейшей) статьи Вы это почерпнули Улыбающийся Не верьте всему прочитанному
Записан
Bepec
Гость
« Ответ #43 : Сентябрь 17, 2014, 17:06 »

Предоставьте мне желательно другой способ безопасного многопоточного вызова любого метода без использования мутекса Веселый

Закавыка в том, что вы предлагаете найти то, что уже нашли вы. Это мало того, что бессмысленно - мутексы проще и гибче, да ещё и попахивает "профессионалом".
Типа я додумался, но никому не скажу, пусть мучаются. Но блин кому надо искать что-то, что нашли вы, когда на полке лежат прекрасно разобранные мутексы?
Они имеют свои ограничения, но эти ограничения уже давно описаны и понятны. 
« Последнее редактирование: Сентябрь 17, 2014, 17:09 от Bepec » Записан
Alexu007
Гость
« Ответ #44 : Сентябрь 17, 2014, 17:16 »

Сделать переменные настроек глобальными, меню настройки пусть их меняет, а разные модули программы только читают. В чём проблема?  Смеющийся
В какой-то момент приходит неприятное ощущение "бардака", обнаруживается что разрозненных переменных уже слишком много и надо с ними что-то делать. Ну это конечно когда проект разрастется.
Я бы назвал глобальные переменные настроек NASTROYKA_!!!READONLY!!!_X21 и не парился.
Записан
Страниц: 1 2 [3] 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.121 секунд. Запросов: 22.