Потоки Windows: как сообщить другим потокам, что мьютекс был выпущен?

#windows #multithreading

#Windows #многопоточность

Вопрос:

У меня есть четыре потока (в четырех ядрах) в Windows, все записывающие данные в один выходной буфер (в разных местах буфера). В какой-то момент буфер заполнится и будет вызван realloc для выделения большего объема памяти. Первый поток, который обнаружит, что буфер заполнен, будет использовать мьютекс с WaitForSingleObject, чтобы получить эксклюзивный доступ и выделить больше памяти. Когда перераспределение будет завершено, поток вызовет ReleaseMutex.

Realloc возвращает новый дескриптор выходного буфера и новый размер. Мне нужно, чтобы другие потоки получили сигнал о том, что произошло перераспределение, чтобы они могли получить новый указатель и размер, прежде чем продолжить.

Мой вопрос в том, будет ли WaitForSingleObject или ReleaseMutex сигнализировать другим потокам о том, что событие произошло, чтобы они могли получить доступ к новому дескриптору и размеру? Должен ли я также устанавливать объект события (с помощью CreateEvent)? Если нет, то как мне сигнализировать об этом событии?

Комментарии:

1. всем потокам требуется вызов WaitForSingleObject перед входом в эксклюзивный регион и ReleaseMutex при выходе. но это используется, если вам нужно синхронизировать потоки из разных процессов. для использования в одном процессе EnterCriticalSection / LeaveCriticalSection или, если не требуется поддержка xp, скажите AcquireSRWLockExclusive / AcquireSRWLockShared и т. Д

2. Как SRWLockExclusive сигнализирует о том, что блокировка была получена и освобождена? Я не вижу никакого механизма сигнализации.

3. когда вам нужен вызов release lock ReleaseSRWLockShared или ReleaseSRWLockExclusive — именно этот сигнал api