static && multithreading
От: LuciferMoscow Россия  
Дата: 21.10.05 07:41
Оценка:
Безопасен ли такой код в многопоточной среде:

// header file
class  SomeSingleton
{
private:
 SomeSingleton();
public:
 static SomeSingleton& Instance();
};

// cpp file
SomeSingleton& SomeSingleton::Instance()
{
 static SomeSingleton Singl;

 return Singl;
}


Заранее благодарен, LCF
Re: static && multithreading
От: Bell Россия  
Дата: 21.10.05 07:59
Оценка:
Здравствуйте, LuciferMoscow, Вы писали:

LM>Безопасен ли такой код в многопоточной среде:


Нет. Подробности поищи сам — такой вопрос проскакивал не один раз.
Любите книгу — источник знаний (с) М.Горький
Re[2]: static && multithreading
От: LuciferMoscow Россия  
Дата: 21.10.05 08:10
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, LuciferMoscow, Вы писали:

LM>>Безопасен ли такой код в многопоточной среде:
B>Нет. Подробности поищи сам — такой вопрос проскакивал не один раз.
Ключевые слова?
Re[3]: static && multithreading
От: Bell Россия  
Дата: 21.10.05 08:19
Оценка:
Здравствуйте, LuciferMoscow, Вы писали:

LM>Ключевые слова?


Да хоть вот эти:
static + потоко
Любите книгу — источник знаний (с) М.Горький
Re[4]: static && multithreading
От: LuciferMoscow Россия  
Дата: 21.10.05 08:41
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, LuciferMoscow, Вы писали:

LM>>Ключевые слова?
B>Да хоть вот эти:
B>static + потоко
грустно, блин.

А как это сделать threadsafety для non POD типов?(не нашел честно)
Re[5]: static && multithreading
От: LuciferMoscow Россия  
Дата: 21.10.05 08:50
Оценка:
Здравствуйте, LuciferMoscow, Вы писали:

LM>Здравствуйте, Bell, Вы писали:


B>>Здравствуйте, LuciferMoscow, Вы писали:

LM>>>Ключевые слова?
B>>Да хоть вот эти:
B>>static + потоко
LM>грустно, блин.

LM>А как это сделать threadsafety для non POD типов?(не нашел честно)

Сразу скажу:



// cpp file
SomeSingleton& SomeSingleton::Instance()
{
 SomeLocker(....);

 static SomeSingleton Singl;

 return Singl;
}

Не предлагать.
Re[3]: static && multithreading
От: Андрей Коростелев Голландия http://www.korostelev.net/
Дата: 21.10.05 09:02
Оценка:
Здравствуйте, LuciferMoscow, Вы писали:

LM>Здравствуйте, Bell, Вы писали:


B>>Здравствуйте, LuciferMoscow, Вы писали:

LM>>>Безопасен ли такой код в многопоточной среде:
B>>Нет. Подробности поищи сам — такой вопрос проскакивал не один раз.
LM>Ключевые слова?

Просто конструкция
static SomeSingleton Singl;
не является атомарной
-- Андрей
Re[5]: static && multithreading
От: Bell Россия  
Дата: 21.10.05 09:18
Оценка:
Здравствуйте, LuciferMoscow, Вы писали:

LM>Здравствуйте, Bell, Вы писали:


B>>Здравствуйте, LuciferMoscow, Вы писали:

LM>>>Ключевые слова?
B>>Да хоть вот эти:
B>>static + потоко
LM>грустно, блин.

LM>А как это сделать threadsafety для non POD типов?(не нашел честно)

Обычная синхронизация поможет
Любите книгу — источник знаний (с) М.Горький
Re[6]: static && multithreading
От: Bell Россия  
Дата: 21.10.05 09:24
Оценка: 8 (1)
Здравствуйте, LuciferMoscow, Вы писали:

LM>Сразу скажу:

LM>
LM>// cpp file
LM>SomeSingleton& SomeSingleton::Instance()
LM>{
LM> SomeLocker(....);

LM> static SomeSingleton Singl;

LM> return Singl;
LM>}

LM>

LM>Не предлагать.

Если не предлагать из-за потерь производительности, то проблему можно разрулить с помощью Double-Checked Locking Pattern:
class Singleton
{
static Singleton* pInst_;
public:
static Singleton& Instance();
};

Singleton* Singleton::pInst_ = 0;

Singleton& Singleton::Instance()
{
   if(pInst_)
      return *pInst_;

   SomeLocker Lock(....);
   static Singleton obj;
   pInst_ = &obj;
   return obj;
}
Любите книгу — источник знаний (с) М.Горький
Re[6]: static && multithreading
От: avbochagov Россия  
Дата: 21.10.05 09:29
Оценка:
Здравствуйте, LuciferMoscow, Вы писали:

LM>>А как это сделать threadsafety для non POD типов?(не нашел честно)

LM>Сразу скажу:

LM>


LM>// cpp file
LM>SomeSingleton& SomeSingleton::Instance()
LM>{
LM> SomeLocker(....);

LM> static SomeSingleton Singl;

LM> return Singl;
LM>}

LM>

LM>Не предлагать.

Интересно было бы узнать почему?

Для подсказки кину такую фамилию — Александреску. У него эта тема разжевана так, что потом вопросов не остаеться.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Re[7]: static && multithreading
От: LuciferMoscow Россия  
Дата: 21.10.05 10:02
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, LuciferMoscow, Вы писали:


LM>>Сразу скажу:

LM>>
LM>>// cpp file
LM>>SomeSingleton& SomeSingleton::Instance()
LM>>{
LM>> SomeLocker(....);

LM>> static SomeSingleton Singl;

LM>> return Singl;
LM>>}

LM>>

LM>>Не предлагать.

B>Если не предлагать из-за потерь производительности, то проблему можно разрулить с помощью Double-Checked Locking Pattern:

B>
B>class Singleton
B>{
B>static Singleton* pInst_;
B>public:
B>static Singleton& Instance();
B>};

B>Singleton* Singleton::pInst_ = 0;

B>Singleton& Singleton::Instance()
B>{
B>   if(pInst_)
B>      return *pInst_;

B>   SomeLocker Lock(....);
B>   static Singleton obj;
B>   pInst_ = &obj;
B>   return obj;
B>}
B>

как раз для использования double lock и просил не предлагать
Re[6]: static && multithreading
От: Андрей Коростелев Голландия http://www.korostelev.net/
Дата: 21.10.05 10:04
Оценка:
Здравствуйте, LuciferMoscow, Вы писали:

LM>Здравствуйте, LuciferMoscow, Вы писали:


LM>>Здравствуйте, Bell, Вы писали:


B>>>Здравствуйте, LuciferMoscow, Вы писали:

LM>>>>Ключевые слова?
B>>>Да хоть вот эти:
B>>>static + потоко
LM>>грустно, блин.

LM>>А как это сделать threadsafety для non POD типов?(не нашел честно)

LM>Сразу скажу:

LM>


LM>// cpp file
LM>SomeSingleton& SomeSingleton::Instance()
LM>{
LM> SomeLocker(....);

LM> static SomeSingleton Singl;

LM> return Singl;
LM>}

LM>

LM>Не предлагать.
Дело в том, что стандарт ничего не говорит про многопоточность, так что мы не можем
полагаться, что компилятор сгенерирует потокобезопасный код для static
Поэтому заботиться о потокобезопасности должен ты сам.
И потому обойтись без мютексов тебе не получится.
-- Андрей
Re[7]: static && multithreading
От: LuciferMoscow Россия  
Дата: 21.10.05 10:07
Оценка:
Здравствуйте, Андрей Коростелев, Вы писали:
Всем спасибо, тема закрыта.

Отдельное спасибо Bellу
Re[7]: static && multithreading
От: alnsn Великобритания http://nasonov.blogspot.com
Дата: 21.10.05 11:17
Оценка: 7 (1)
Здравствуйте, avbochagov, Вы писали:

A>Для подсказки кину такую фамилию — Александреску. У него эта тема разжевана так, что потом вопросов не остаеться.


Одна голова хорошо, а две лучше! Читаем здесь.
Re[8]: static && multithreading
От: Bell Россия  
Дата: 21.10.05 11:22
Оценка:
Здравствуйте, LuciferMoscow, Вы писали:

LM>как раз для использования double lock и просил не предлагать


Прошу прошения — в предыдущий пост вкралась ошибка
Вот правильная реализация метода Instance:

Singleton& Singleton::Instance()
{
   if(pInst_)
      return *pInst_;

   SomeLocker Lock(....);
   if(pInst_)//Вот она, вторая проверка :-/
      return *pInst_;

   static Singleton obj;
   pInst_ = &obj;
   return obj;
}


Кроме того, почитай Александреску (6.9.1) — там упоминаются некоторые тонкости, связанные с этим паттерном.
Любите книгу — источник знаний (с) М.Горький
Re[9]: static && multithreading
От: IID Россия  
Дата: 21.10.05 14:32
Оценка: 1 (1) +2
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, LuciferMoscow, Вы писали:


LM>>как раз для использования double lock и просил не предлагать



double-checking lock суть зло

The pattern is usually unsafe on modern computer hardware and/or optimizing compilers.

One of the dangers of using double-checked locking is that it will often appear to work: it is not easy to distinguish between a correct implementation of the technique and one that has subtle problems. Depending on the hardware platform, the compiler, the interleaving of threads by the scheduler and the nature of other concurrent system activity, failures resulting from an incorrect implementation of double-checking locking may only occur intermittently. Reproducing the failures can be difficult.

стандарт частично решает проблему использованием
volatile sig_atomic_t integer


Type of object that can be modified as atomic entity, even in presence of asynchronous interrupts;

однако только теоретически. На практике я бы поостерёгся решения, целиком построенного на соответствии оптимизатора компилятора и стандарта.
kalsarikännit
Re: static && multithreading
От: Аноним  
Дата: 21.10.05 14:38
Оценка:
Здравствуйте, LuciferMoscow, Вы писали:

LM>Безопасен ли такой код в многопоточной среде:


Уже ответили, что нет...
С сингелтонами лучше их сначала явно проиницировать,
а только потом запустить потоки.

Убивание сингелтонов — тоже нетривиальная задача,
даже в однопоточной среде.
Re[5]: static && multithreading
От: Centaur Россия  
Дата: 21.10.05 14:47
Оценка:
Здравствуйте, LuciferMoscow, Вы писали:

LM>грустно, блин.


LM>А как это сделать threadsafety для non POD типов?(не нашел честно)


Попросту нужно заставить синглтон родиться до того, как пойдёт массивная многопоточность.
Re: static && multithreading
От: Alex Alexandrov США  
Дата: 21.10.05 18:28
Оценка: 9 (2)
Здравствуйте, LuciferMoscow, Вы писали:

LM>Безопасен ли такой код в многопоточной среде:



[...]

GCC 4.0 по умолчанию синхронизирует создание статических-на-уровне-функции объектов:

The compiler now uses the library interface specified by the C++ ABI for thread-safe initialization of function-scope static variables. Most users should leave this alone, but embedded programmers may want to disable this by specifying -fno-threadsafe-statics for a small savings in code size.

... << RSDN@Home 1.1.4 beta 7 rev. 447>>
It's kind of fun to do the impossible (Walt Disney)
Re: static && multithreading
От: Кодт Россия  
Дата: 21.10.05 19:18
Оценка:
Здравствуйте, LuciferMoscow и все-все-все

А что, если заставить статические данные инициализироваться на ранней стадии, в контексте главного потока до входа в main()?
Т.е. сделать объект (или ссылку на него) глобальным.
Data& init_instance()
{
  static Data data;
  // медленно и печально работаем
  .....
  return data;
}

Data& instance = init_instance();


Или это противоречит логике работы (временной диаграмме)?
Перекуём баги на фичи!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.