Здравствуйте, 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 заменяет символы, недопустимые в имени мьютекса ('\' и ':') на какие-то другие допустимые, например '|' и '$'.