Здравствуйте, Alexander G, Вы писали:
AG>Я не зочу volatile т.к. его смысл зависит от компилятора.
AG>Может тогда так ?
_WriteBarrier() ещё больше зависит от компилятора (intrinsic MSVC). А если код только под MSVC, то проще и правильнее использовать volatile.
Здравствуйте, 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));
}