Здравствуйте, crea7or, Вы писали:
AF>>А чем named mutex вместо critical section не подходит. Тогда все тривиально:
AF>>[ccode] AF>>void CSyncFile::Open( AF>> IN PCTSTR pszFileName AF>> ) AF>>{ AF>> m_hMutex = CreateMutex(NULL, FALSE, TranslateName(pszFileName)); AF>> WaitForSingleObject(m_hMutex, INFINITE); AF>> m_hFile = CreateFile(pszFileName, ...); AF>>}
C>а хэндл мутекса можно два раза закрывать? или придётся проверять когда открылся уже существующих и не закрывать уже.
Не можно, а нужно. На каждый вызов CreateMutex должен быть свой вызов CloseHandle.
Нужна такая хитрая конструкция. Проще всего объяснить её на примере с critical section.
Открывается файл — и создаётся critical_section "привязанный" к имени файла, если другой поток пытается открыть тотже файл то он попадает в waiting пока тот первый кто открыл не закроет файл. Ествественно всё будет в своих классах закрыто и доступ централизованный — но, пока кроме как вариант со списком ничего в голову не приходит. Может есть какое красивое решение?
Здравствуйте, crea7or, Вы писали:
C>Нужна такая хитрая конструкция. Проще всего объяснить её на примере с critical section.
C>Открывается файл — и создаётся critical_section "привязанный" к имени файла, если другой поток пытается открыть тотже файл то он попадает в waiting пока тот первый кто открыл не закроет файл. Ествественно всё будет в своих классах закрыто и доступ централизованный — но, пока кроме как вариант со списком ничего в голову не приходит. Может есть какое красивое решение?
А чем named mutex вместо critical section не подходит. Тогда все тривиально:
Здравствуйте, Alex Fedotov, Вы писали:
AF>Функция TranslateName заменяет символы, недопустимые в имени мьютекса ('\' и ':') на какие-то другие допустимые, например '|' и '$'.
Обратный слеш ествественнее заменить на прямой. А вот где написано, что двоеточие — недопустимый?
C>>а хэндл мутекса можно два раза закрывать? или придётся проверять когда открылся уже существующих и не закрывать уже.
AF>Не можно, а нужно. На каждый вызов CreateMutex должен быть свой вызов CloseHandle.
ага, значит он хэндлы на мутекс даёт — в мсдн туманно на эту тему хоть и написано что надо закрывать все хендлы мутекса.
Здравствуйте, crea7or, Вы писали:
C>Нужна такая хитрая конструкция. Проще всего объяснить её на примере с critical section.
C>Открывается файл — и создаётся critical_section "привязанный" к имени файла, если другой поток пытается открыть тотже файл то он попадает в waiting пока тот первый кто открыл не закроет файл. Ествественно всё будет в своих классах закрыто и доступ централизованный — но, пока кроме как вариант со списком ничего в голову не приходит. Может есть какое красивое решение?
А чем не устраивает открывать файл с запретом на разделение доступа (параметр dwShareMode вызова CreateFile)?
Учти, что если ты хочешь делать это своим способом, то critical section надо создавать до того, как ты открываешь файл. Иначе есть вероятность, что другой поток втиснется между вызовами создания файла и создания секции.
C>>Открывается файл — и создаётся critical_section "привязанный" к имени файла, если другой поток пытается открыть тотже файл то он попадает в waiting пока тот первый кто открыл не закроет файл. Ествественно всё будет в своих классах закрыто и доступ централизованный — но, пока кроме как вариант со списком ничего в голову не приходит. Может есть какое красивое решение?
VB>А чем не устраивает открывать файл с запретом на разделение доступа (параметр dwShareMode вызова CreateFile)?
Так он просто вывалится с шаринг виолатион, а мне надо чтобы он ждал
VB>Учти, что если ты хочешь делать это своим способом, то critical section надо создавать до того, как ты открываешь файл. Иначе есть вероятность, что другой поток втиснется между вызовами создания файла и создания секции.