У меня есть поток, который захватывает ввод контроллера. Это единственное, что делает этот поток — он вызывает XInputGetState()
каждые х миллисекунд и сохраняет результат в синхронизированном циклическом буфере. У меня есть другой поток, который реагирует на этот вход, вибрируя контроллер через XInputSetState()
когда определенное условие было достигнуто.
Другими словами, один поток только вызывает XInputGetState()
в то время как другой поток только когда-либо вызывает XInputSetState()
, Теоретически, не может быть точки, в которой любая функция вызывается несколько раз одновременно. Все еще небезопасно делать это без синхронизации?
Примечание. Эти две функции работают с совершенно другим набором данных, но реализация, скорее всего, читает / записывает что-то, что не синхронизировано.
Да, в этом случае, потому что API XInput принимает блокировку критического раздела при каждом вызове внешней точки входа.
Кстати, когда вы используете XInput, взгляните на этот Сообщение блога. Только с этими двумя API вы можете использовать XInput 9.1.0, который встроен в Windows Vista и более поздние ОС, заголовки для него находятся в Windows 8.x SDK, и это избавляет от необходимости связываться с унаследованным DirectSetup развернуть XInput 1.3. Конечно, если вы используете приложения Магазина Windows, вы просто используете XInput 1.4, который является частью ОС Windows 8.x, а заголовки находятся в Windows 8.x SDK. Единственная ситуация, когда вам нужно использовать устаревший DirectX SDK, — это получить поддержку захвата / воспроизведения звука в Windows 7 или более ранней версии.
«… и сохраняет результат в синхронизированном циклическом буфере. У меня есть другая тема, которая реагирует на этот вход …«прямо противоречит вашему другому утверждению:»не может быть точки, в которой любая функция вызывается одновременно» потому что вы не гарантировано ОС, что ваш поток будет закончить обработку что бы он ни делал, прежде чем он будет возвращен в состояние ожидания.
Другими словами: теоретически (и на практике тоже!) Ваш поток чтения может быть в процессе загрузки данных в общий буфер и заменен планировщиком и потоком записи, запланированным для выполнения. в то время как общий буфер находится в процессе обновления.
Вообще говоря, если у вас есть более одного независимого доступа к общему ресурсу (в вашем случае — «синхронизированный циклический буфер»), вам лучше делать все правильно 🙂
Если в вашем сценарии вы все-таки решите использовать небезопасное решение, у вас могут возникнуть те неприятные ошибки, которые происходят раз в месяц, и которые почти невозможно отладить.