Re[15]: Race condition
От: remark Россия http://www.1024cores.net/
Дата: 02.02.09 18:14
Оценка: 11 (2) +1
Здравствуйте, Alexander G, Вы писали:

AG>Я не зочу volatile т.к. его смысл зависит от компилятора.

AG>Может тогда так ?

_WriteBarrier() ещё больше зависит от компилятора (intrinsic MSVC). А если код только под MSVC, то проще и правильнее использовать volatile.


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[16]: Race condition
От: Alexander G Украина  
Дата: 02.02.09 18:57
Оценка:
Здравствуйте, Quasi, Вы писали:

Q>Как раз для семейства Intel Itanium (_M_IA64) барьера компилятора не достаточно, под Windows проще всего:

Q>
Q>    //.....
Q>    ::InterlockedExchangePointer(reinterpret_cast<void**>(&p_data), &data);
Q>


Так можно ?

struct data_t
{
  void * p1;
  void * p2;
  int  i3;
} data = {0};

union
{
  data_t* d;
  void volatile* p;
} p_data;

 
data_t* init()
{
  if (p_data.d)
    return p_data.d;
  if (void * d = InterlockedCompareExchangePointer(&p_data.p, 0, 0))
    return reinterpret_cast<data_t*>(d);
  data.p1 = ::GetModuleHandle(...);
  data.p2 = ::GetProcAddress(...);
  data.i3 = (int)sqrt(42*_WIN_VER);
  return reinterpret_cast<data_t*>(
    InterlockedExchangePointer(&p_data.p, &data));
}
Русский военный корабль идёт ко дну!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.