- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
#include <stdint.h>
#include <Windows.h>
#include <intrin.h>
typedef long dt;
namespace {
dt InitializationIsInProgress = 0;
dt InitializationIsFinished = 0;
}
dt InterlockedLoad(dt volatile * t){
return InterlockedCompareExchange(t, 0, 0);
}
dt InterlockedAssign(dt volatile * t, dt v){
dt c = 0;
while (c = InterlockedCompareExchange(t, v, c));
}
void InitializeSystem(){
if (InterlockedLoad(&InitializationIsFinished) == 1)
return;
while (InterlockedCompareExchange(&InitializationIsInProgress, 1, 0) == 1) Sleep(0);
//__ReadWriteBarrier();
if (InterlockedLoad(&InitializationIsFinished) == 1)
return;
Work();
InterlockedAssign(&InitializationIsFinished, 1);
InterlockedAssign(&InitializationIsInProgress, 0);
}
Не судите строга. Воспользуюсь как пастебином. Если найдете ошибки - пришлю пирожок.
LispGovno 04.02.2015 20:13 # 0
Xom94ok 04.02.2015 20:41 # 0
LispGovno 04.02.2015 21:35 # +1
bormand 05.02.2015 11:36 # 0
LispGovno 05.02.2015 10:10 # 0
bormand 05.02.2015 10:22 # 0
Помещаем в переменную 0 если в ней был ноль? Вот зе фак?
LispGovno 05.02.2015 11:18 # 0
bormand 05.02.2015 11:51 # 0
LispGovno 05.02.2015 13:36 # 0
Xom94ok 05.02.2015 11:56 # +1
bormand 05.02.2015 12:03 # 0
LispGovno 05.02.2015 13:38 # 0
bormand 06.02.2015 07:09 # +1
Цикл можно убрать, емнип, только поставив какой-нить wait condition (event в winapi) но там начинается проблема с тем, кто будет его запиливать...
bormand 06.02.2015 07:18 # +1
bormand 06.02.2015 07:34 # 0
LispGovno 06.02.2015 07:44 # 0
bormand 06.02.2015 07:52 # +1
Я только про данный случай.
atomic_store() аля InterlockedAssign(), емнип, просто запись в правильно выровненную переменную + фенс нужного типа (если relaxed - то просто запись безо всяких фенсов)...
LispGovno 06.02.2015 08:00 # 0
bormand 06.02.2015 08:08 # +1
Т.е. под msvc можно сделать переменную со статусом volatile и правильно выровнять её. Тогда самая обычная запись в неё будет atomic_store с release семантикой. А самое обычное чтение - atomic_load с aquire семантикой. Должно работать даже на ARM'ах с вендой.
bormand 06.02.2015 09:28 # 0
LispGovno 06.02.2015 10:10 # 0
bormand 06.02.2015 10:30 # 0
bormand 06.02.2015 11:08 # 0
kegdan 06.02.2015 10:58 # 0
а есть и классический Thread.MemoryBarrier().
из разряда - "очень занимательно но нахуй не нужно"
bormand 06.02.2015 11:09 # +1
kegdan 06.02.2015 11:11 # +1
LispGovno 05.02.2015 13:44 # 0
kegdan 05.02.2015 13:49 # +1
LispGovno 06.02.2015 01:03 # +1
kegdan 06.02.2015 01:06 # +1
LispGovno 06.02.2015 02:32 # +1
kegdan 06.02.2015 02:52 # +1
LispGovno 06.02.2015 07:47 # +1
kegdan 06.02.2015 08:00 # +1
kegdan 07.02.2015 05:22 # +1
bormand 05.02.2015 13:01 # +1
LispGovno 05.02.2015 13:38 # 0
bormand 05.02.2015 14:04 # 0
LispGovno 05.02.2015 13:42 # 0
bormand 05.02.2015 14:05 # 0
На кешлайн равняют чтобы поднять производительность для независимых переменных.
bormand 06.02.2015 06:47 # +1
LispGovno 06.02.2015 07:38 # +1