XInputGetState и XInputSetState вызываются из разных потоков

У меня есть поток, который захватывает ввод контроллера. Это единственное, что делает этот поток — он вызывает XInputGetState() каждые х миллисекунд и сохраняет результат в синхронизированном циклическом буфере. У меня есть другой поток, который реагирует на этот вход, вибрируя контроллер через XInputSetState() когда определенное условие было достигнуто.

Другими словами, один поток только вызывает XInputGetState()в то время как другой поток только когда-либо вызывает XInputSetState(), Теоретически, не может быть точки, в которой любая функция вызывается несколько раз одновременно. Все еще небезопасно делать это без синхронизации?

Примечание. Эти две функции работают с совершенно другим набором данных, но реализация, скорее всего, читает / записывает что-то, что не синхронизировано.

1

Решение

Да, в этом случае, потому что 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 или более ранней версии.

2

Другие решения

«… и сохраняет результат в синхронизированном циклическом буфере. У меня есть другая тема, которая реагирует на этот вход …«прямо противоречит вашему другому утверждению:»не может быть точки, в которой любая функция вызывается одновременно» потому что вы не гарантировано ОС, что ваш поток будет закончить обработку что бы он ни делал, прежде чем он будет возвращен в состояние ожидания.

Другими словами: теоретически (и на практике тоже!) Ваш поток чтения может быть в процессе загрузки данных в общий буфер и заменен планировщиком и потоком записи, запланированным для выполнения. в то время как общий буфер находится в процессе обновления.

Вообще говоря, если у вас есть более одного независимого доступа к общему ресурсу (в вашем случае — «синхронизированный циклический буфер»), вам лучше делать все правильно 🙂

Если в вашем сценарии вы все-таки решите использовать небезопасное решение, у вас могут возникнуть те неприятные ошибки, которые происходят раз в месяц, и которые почти невозможно отладить.

0

По вопросам рекламы [email protected]