[СИ] mmap-массив и синхронизация.
Ясык СИ
ОС UNIX
Фрагмент кода:
//--- родительский процесс - только читает arr[] ---
....
arr=(int*)mmap(NULL, sizeof(int)*ARRSIZE, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANON, -1, 0);
....
while(1){
....
n0=0;
i=0;
while(i < n){ //--- n <= ARRSIZE ---
if(arr[i]==0) n0++;
i++;
}
....
}
//--- дочерний процесс ---
//--- имеет уникальный номер i, соответствующий индексу arr[] ---
start:
....
arr[i]=1;
....
arr[i]=0;
....
goto start;
Родительский процесс (мастер-процесс) периодически читает
arr[] на предмет подсчета свободных рабочих процессов пула.
Никогда не пишет туда.
Рабочие процессы пишут в arr[] свободен-занят, каждый под
своим индексом.
Без какой-либо синхронизации.
Почему без синхронизации?
Здесь и сейчас для упрощения.
Там и потом по другим причинам.
По простоте я понимаю так.
Запись одного элемента не должна бы влиять на другие элементы.
А если чтение точно совпадет с записью, то будет прочитан ноль
или не ноль. И то и другое правильно. Микросекунды не в счет.
Предполагаю так же, что перебивка чтением-записью не испортит запись.
Тест проходит хорошо. Везение. А как на самом деле?
Кто знает прошу ответить.