c windows многопоточная блокировка файлов

Есть ли в Windows какой-либо простой способ заблокировать файл эксклюзивным способом (чтение и запись для моего программного обеспечения) в многопоточном коде C? Я пробовал LockFileEx, но он работает только между процессами, а не для потока (того же процесса).

Примечание. Моя проблема в том, что я сделал небольшой файловый сервер (многопоточный), когда приходит запрос на файл, один поток "A" должен получить монопольный доступ к запрошенному "file1.txt", но если другой поток " B» хочет тот же самый «file1.txt», который он должен ждать, прежде чем использовать этот файл. Если поток "A" использует CreateFile() с dwSharedMode в "0" для открытия/создания "file1.txt", гарантирует, что только он читает или открывает этот файл, на самом деле возникает ошибка, если поток "B" пытается открыть "file1 .текст". Теперь, как поток "B" может ожидать "file1.txt"?


person user2199646    schedule 25.03.2013    source источник
comment
Я бы сказал, что вы должны знать, что делают ваши потоки, и реализовать блокировку самостоятельно (с помощью Mutex, например).   -  person Jonathon Reinhart    schedule 25.03.2013
comment
Посмотрите ниже на ответ Аникета. Блокировка файлов более эффективна, чем блокировка мьютекса или потока. Он также работает на кластерных серверах или общих дисках. Например, одни и те же каталоги и файлы используются вашим мини-сервером, работающим на двух разных компьютерах.   -  person TamusJRoyce    schedule 23.04.2014


Ответы (3)


Вы можете открыть файл в эксклюзивном режиме, установив dwShareMode в 0 в функции CreateFile().

Подробнее читайте здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/aa363874(v=vs.85).aspx

person Aniket Inge    schedule 25.03.2013
comment
Примечание. Моя проблема в том, что я сделал небольшой файловый сервер (многопоточный), когда приходит запрос на файл, один поток A должен получить монопольный доступ к запрошенному файлу1.txt, но если другой поток B хочет тот же файл1 .txt он должен подождать, прежде чем использовать этот файл. Если поток A использует CreateFile() с dwSharedMode, равным 0, для открытия/создания файла file1.txt, гарантирует, что только он читает или открывает этот файл, фактически возникает ошибка, если поток B пытается открыть файл file1.txt. Теперь, как поток B может ждать в файле1.txt? - person user2199646; 25.03.2013
comment
Файлы по своей сути потокобезопасны. Просто попробуйте открыть файл. Если на файл установлена ​​эксклюзивная блокировка, подождите. Вот твой шкафчик. Это гарантированно атомарно, между потоками или между процессами. - person TamusJRoyce; 23.04.2014

Я так понимаю, что ваш вопрос звучит так: как организовать доступ к ресурсу(файлу) для нескольких потоков (должна быть решена проблема чтения-записи).

Если ваш ресурс должен использоваться совместно потоками, работающими в одном процессе:
используйте примитив синхронизации critical_section (он более эффективен, чем примитивы синхронизации системных объектов, но работает только для потоков внутри одного процесса).
иначе используйте mutex;

person spin_eight    schedule 25.03.2013

Slim Reader/Writer (SRW) Замки

Блокировки SRW обеспечивают два режима, в которых потоки могут получить доступ к общему ресурсу:

  • Общий режим, который предоставляет общий доступ только для чтения нескольким потокам чтения, что позволяет им одновременно считывать данные из общего ресурса. Если операции чтения превышают операции записи, такой параллелизм увеличивает производительность и пропускную способность по сравнению с критическими разделами.

  • Эксклюзивный режим, предоставляющий доступ для чтения и записи к одному потоку записи одновременно. Когда блокировка получена в эксклюзивном режиме, ни один другой поток не может получить доступ к общему ресурсу, пока модуль записи не снимет блокировку.

person Scy    schedule 25.03.2013