Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: потокобезопасная инициализация глобальной переменной  (Прочитано 8863 раз)
0 Пользователей и 1 Гость смотрят эту тему.
stlex
Новенький

ru
Offline Offline

« : 11-04-2017 06:39 » 

Здравствуйте! потокобезопасен ли такой код для инициализации вектора - глобальной переменной
Код:
static std::vector<std::shared_ptr<ConvertCreator>> AllCreators;

ConvertRegistrator::ConvertRegistrator( std::shared_ptr<ConvertCreator> creator )
{
   AllCreators.push_back( creator );
}

static const ConvertRegistrator reg1( new ConcreteCreator );
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 11-04-2017 07:00 » 

stlex, а зачем рисковать ? Ведь ты не только инициализировать собираешься, но ещё и работать с ним

как-нибудь так
Код: (C++)
static std::vector<std::shared_ptr<ConvertCreator>> AllCreators;
static SOMESYNCTYPE AllCreators_sync_object;

ConvertRegistrator::ConvertRegistrator( std::shared_ptr<ConvertCreator> creator )
{
   AllCreators_sync_object.lock();
   AllCreators.push_back( creator );
   AllCreators_sync_object.unlock();
}

std::shared_ptr<ConvertCreator> ConvertRegistrator::operator[](int i)
{
   std::shared_ptr<ConvertCreator> res=0;

   AllCreators_sync_object.lock();
   if(i<AllCreators.size())
   {
        res=AllCreators[i];
   }
   AllCreators_sync_object.unlock();

   return res;
}

static const ConvertRegistrator reg1( new ConcreteCreator );



а вообще, глобальные переменные не одобряю  Внимание! Говорит и показывает...
Записан

stlex
Новенький

ru
Offline Offline

« Ответ #2 : 11-04-2017 07:03 » 

после инициализации работа только на чтение будет
Записан
stlex
Новенький

ru
Offline Offline

« Ответ #3 : 11-04-2017 11:11 » 

Упс.. а ведь reg1 может быть инициализирован, когда AllCreators еще нет. Значит, такого вообще писать нельзя. Спасибо, вопрос закрыт
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 11-04-2017 11:23 » 

Упс.. а ведь reg1 может быть инициализирован, когда AllCreators еще нет.
это как так ? Тут AllCreators объявлен раньше, чем reg1

другое дело, что взрыв на макаронной фабрике глобальная рассыпуха
Записан

stlex
Новенький

ru
Offline Offline

« Ответ #5 : 11-04-2017 12:36 » 

reg1 в другом c++ можно объявить
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 11-04-2017 12:48 » 

stlex,

а в начале этого другого cpp можно вставить

Код: (C++)
extern std::vector<std::shared_ptr<ConvertCreator>> AllCreators;

но гемора это не убавит

хотя чё я тебе подсказываю, конечно же так не надо делать, лучше сразу класс оформить нормальный
Улыбаюсь
Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 11-04-2017 23:06 » new

Копирование shared_ptr и его деструктор потокобезопасны. В чем еще сомнение в этом примере?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines