1. Теперь за форумную активность начисляются биткоины и другие криптоденьги. Подробнее.
    Скрыть объявление
  2. Появилась архивная версия форума arhiv.xaker.name, где собраны темы с 2007 по 2012 год.
    Скрыть объявление

[C++]Использование Inode в качестве синхронизации потоков

Тема в разделе "C/C++", создана пользователем de3zor, 29 мар 2013.

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

Поделиться этой страницей

Загрузка...