Если вы хотите сделать это для файла, вы можете определить некоторую гранулярность и объявить блокировки на основе этой гранулярности.Например, для больших файлов вы можете использовать размер 4 КБ (размер страницы в системе) и сказать, что каждая ч / б блокировка имеет гранулярность 4 КБ для файла, а количество блокировок просто равно размеру файла / 4 КБ.Вы можете использовать любой произвольный размер, который вам нужен, и, конечно, есть компромисс между более точной блокировкой зерна (больше памяти для отслеживания блокировок региона) и достижением наилучшей производительности.
Вы можете попробовать что-то вроде
#define MYGRANULARITY 4096
lock filelocks[file_size / MYGRANULARITY];
/* Code to do read or write */
int lock_idx = location_to_rw / MYGRANULARITY;
lock(filelocks[lock_idx]);
/* do work with it */
unlock(filelocks[lock_idx]);
Чтобы заблокировать блокировку гранулярности, все, что вам нужно сделать, - это найти блокировку, которую нужно захватить, и выполнить нормальное поведение блокировки R / W.