SDL: безопасно ли это делать в многопоточной программе?

У меня есть поток, который делает следующее:

  • Инициализирует SDL
  • Сохраняет указатель на SDL_Surface
  • Заходит в цикл и ждет любых событий мыши и обрабатывает их

В другом потоке есть функция, которая делает следующее:

  • Получает указатель на SDL_Surface
  • Имеет ли SDL_LockSurface
  • Манипулирует пикселями
  • Использует ли SDL_UnlockSurface
  • Вызывает SDL_Flip на поверхности

Я читал в документации, что обычно вызовы функций SDL lib должны быть из одного потока. Включает ли это прямое изменение SDL_Surface? Как насчет использования функций блокировки и разблокировки поверхности? Я думаю, что эта пара блокировки и разблокировки предназначена для использования в многопоточных ситуациях.

Как насчет функции SDL_Flip? Если это нужно вызвать из потока SDL, который инициализировал SDL, я мог бы просто сигнализировать о пользовательском событии и обрабатывать его в другом потоке.


person waffleman    schedule 06.10.2010    source источник


Ответы (1)


Блокировка/разблокировка на SDL_Surfaces предназначена для обработки бэкэндов, которые помещают растровые изображения во что-то, кроме системной памяти. Блокировка поверхности извлекает растровое изображение обратно в системную память для модификации, а разблокировка выталкивает его обратно.

Они не для многопоточности.

Вы можете обойтись блокировкой/разблокировкой поверхности в основном потоке и передачей указателя растрового изображения в рабочий поток.

person genpfault    schedule 06.10.2010
comment
SDL_LockSurface() и SDL_UnlockSurface не работают на большинстве платформ. Я не могу точно вспомнить сейчас, но я думаю, что они нужны только для GDI или DirectX. В любом случае они абсолютно бесполезны для синхронизации потоков. - person ninjalj; 07.10.2010