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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.