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
Вижте по-долу отговора на Aniket. Заключването на файлове е по-тежко от заключването на mutex или нишка. Той също така работи в клъстерни сървъри или споделени дискове. Например едни и същи директории и файлове се използват от вашия мини-сървър, работещ на два различни компютъра.   -  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 трябва да получи достъп по ексклузивен начин до искания file1.txt, но ако друга нишка B иска същия файл1 .txt трябва да изчака преди да използва този файл. Ако нишка A използва CreateFile() с dwSharedMode до 0 за отваряне/създаване на file1.txt, гарантира, че само тя чете или отваря този файл, всъщност възниква грешка, ако нишка B се опита да отвори file1.txt. Сега как нишка B може да чака file1.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