#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