Скрестить File и Critical section
От: crea7or http://crea7or.spb.ru
Дата: 11.10.05 00:18
Оценка:
Нужна такая хитрая конструкция. Проще всего объяснить её на примере с critical section.

Открывается файл — и создаётся critical_section "привязанный" к имени файла, если другой поток пытается открыть тотже файл то он попадает в waiting пока тот первый кто открыл не закроет файл. Ествественно всё будет в своих классах закрыто и доступ централизованный — но, пока кроме как вариант со списком ничего в голову не приходит. Может есть какое красивое решение?
Re: Скрестить File и Critical section
От: Alex Fedotov США  
Дата: 11.10.05 01:36
Оценка:
Здравствуйте, crea7or, Вы писали:

C>Нужна такая хитрая конструкция. Проще всего объяснить её на примере с critical section.


C>Открывается файл — и создаётся critical_section "привязанный" к имени файла, если другой поток пытается открыть тотже файл то он попадает в waiting пока тот первый кто открыл не закроет файл. Ествественно всё будет в своих классах закрыто и доступ централизованный — но, пока кроме как вариант со списком ничего в голову не приходит. Может есть какое красивое решение?


А чем named mutex вместо critical section не подходит. Тогда все тривиально:

void CSyncFile::Open(
    IN PCTSTR pszFileName
    )
{
    m_hMutex = CreateMutex(NULL, FALSE, TranslateName(pszFileName));
    
    WaitForSingleObject(m_hMutex, INFINITE);

    m_hFile = CreateFile(pszFileName, ...);
}

void CSyncFile::Close()
{
    CloseHandle(m_hFile);
    ReleaseMutex(m_hMutex);
    CloseHandle(m_hMutex);
}


Функция TranslateName заменяет символы, недопустимые в имени мьютекса ('\' и ':') на какие-то другие допустимые, например '|' и '$'.
-- Alex Fedotov
Re[2]: Скрестить File и Critical section
От: Кодёнок  
Дата: 11.10.05 06:37
Оценка:
Здравствуйте, Alex Fedotov, Вы писали:

AF>Функция TranslateName заменяет символы, недопустимые в имени мьютекса ('\' и ':') на какие-то другие допустимые, например '|' и '$'.


Обратный слеш ествественнее заменить на прямой. А вот где написано, что двоеточие — недопустимый?
Re[2]: Скрестить File и Critical section
От: crea7or http://crea7or.spb.ru
Дата: 11.10.05 13:35
Оценка:
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>}

а хэндл мутекса можно два раза закрывать? или придётся проверять когда открылся уже существующих и не закрывать уже.
Re[3]: Скрестить File и Critical section
От: Alex Fedotov США  
Дата: 11.10.05 14:47
Оценка: 8 (2)
Здравствуйте, 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.
-- Alex Fedotov
Re[4]: Скрестить File и Critical section
От: crea7or http://crea7or.spb.ru
Дата: 11.10.05 14:59
Оценка:
C>>а хэндл мутекса можно два раза закрывать? или придётся проверять когда открылся уже существующих и не закрывать уже.

AF>Не можно, а нужно. На каждый вызов CreateMutex должен быть свой вызов CloseHandle.


ага, значит он хэндлы на мутекс даёт — в мсдн туманно на эту тему хоть и написано что надо закрывать все хендлы мутекса.

Спасибо!
Re: Скрестить File и Critical section
От: Vadim B  
Дата: 11.10.05 17:50
Оценка:
Здравствуйте, crea7or, Вы писали:

C>Нужна такая хитрая конструкция. Проще всего объяснить её на примере с critical section.


C>Открывается файл — и создаётся critical_section "привязанный" к имени файла, если другой поток пытается открыть тотже файл то он попадает в waiting пока тот первый кто открыл не закроет файл. Ествественно всё будет в своих классах закрыто и доступ централизованный — но, пока кроме как вариант со списком ничего в голову не приходит. Может есть какое красивое решение?


А чем не устраивает открывать файл с запретом на разделение доступа (параметр dwShareMode вызова CreateFile)?

Учти, что если ты хочешь делать это своим способом, то critical section надо создавать до того, как ты открываешь файл. Иначе есть вероятность, что другой поток втиснется между вызовами создания файла и создания секции.
Re[2]: Скрестить File и Critical section
От: crea7or http://crea7or.spb.ru
Дата: 11.10.05 18:17
Оценка:
C>>Открывается файл — и создаётся critical_section "привязанный" к имени файла, если другой поток пытается открыть тотже файл то он попадает в waiting пока тот первый кто открыл не закроет файл. Ествественно всё будет в своих классах закрыто и доступ централизованный — но, пока кроме как вариант со списком ничего в голову не приходит. Может есть какое красивое решение?

VB>А чем не устраивает открывать файл с запретом на разделение доступа (параметр dwShareMode вызова CreateFile)?


Так он просто вывалится с шаринг виолатион, а мне надо чтобы он ждал

VB>Учти, что если ты хочешь делать это своим способом, то critical section надо создавать до того, как ты открываешь файл. Иначе есть вероятность, что другой поток втиснется между вызовами создания файла и создания секции.


ну это ясно
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.