Доброго времени суток, форумчане. Дело обстоит так. Есть 2*n потоков. Каждый нечетный поток записывает некоторый файл на диск, каждый четный - считывает этот же файл параллельно ( потоки работают парами, не зависящими друг от друга). Смысл в том, что запрещено использовать любые средства синхронизации потоков( мьютексы, семофоры и т.п.). Единственный возможный вариант - использование так называемого inode(индексного дескриптора). Если я все правильно понял, нужно каким-то магическим способом находить адреса сегментов памяти, в которых хранится файл, и состояния(ну или флаги) каждого конкретного сегмента в отдельности, находится ли он в состоянии записи\чтения. Интернеты, к сожалению, ничего путного выплюнуть не могут. Может быть кто-нибудь сталкивался с подобными вещами ? Или хотя бы может дать более-менее адекватное и конкретное направление для поиска ?
При записи блокировать файл на чтение, и, соответственно, наоборот? Ну и конечно в потоках открывать не с правами rw, а только с теми, что требуются. Не знаю, на какой платформе такое необходимо делать, но вот в какую сторону сторону копать в области winAPI. Также можно просто через CreateFile для записи открывать заново, для чтения открывать существующий. П.С. А вообще алгоритм странный, обычно количество потоков при операциях с файлами стараются уменьшать.
1nt, Приложение должно работать под Desktop Linux дистрибутивом. Соответственно, ФС будет Ext4. Кажется, я не совсем понятно объяснил. Мне запрещено пользоваться готовыми средствами блокировки в принципе. Единственный возможный способ синхронизации я описал выше. В поставленной задаче вопрос оптимизации не стоит вовсе. Смысл именно в реализации подобного рода синхронизации, которая будет работать для любых файлов любого размера при параллельной работе с ними. Вообще, здесь больше вопрос о работе с файловой системой и понимании ее реализации и работы в целом.
Если я правильно здесь понимаю понятие синхронизации, то в один момент времени нужно либо читать, либо писать? Чтобы потоки ерунды не натворили? Если так, то есть допустим ifstream и ofstream. Допустим, поток чтения юзает ifstream, сначала он проверяет, привязан ли объект ofstream к файлу. Если не привязан, то спокойно читаем все что надо. Если привязан - ждем. Также делаем в случае записи. Но это если я правильно понял как нужно сихронизировать потоки, иначе советую обратиться на специализированный форум с этим вопросом.
Ну в общем, решение есть. Вдруг кому пригодится struct inode * inode = FILE -> f_path.dentry -> d_inode -> i_sem i_sem - встроенный в inode семафор. FILE - указатель на struct FILE , полученный через fopen()