我目前正在使用 Allegro 跨平台库开始开发 C 语言独立游戏。我想我会将诸如输入、声音、游戏引擎和图形之类的东西分离到它们自己独立的线程中,以提高程序的健壮性。没有任何多线程经验,我的问题是:
如果我在内存中有一段数据(例如,指向数据结构的指针),一个线程可以随意写入它,另一个线程随意读取它,还是每个线程都必须使用互斥锁锁定内存,然后读取或写入,然后解锁?
特别是,我在考虑游戏引擎和视频渲染器之间的交互。(这是二维的。)我的计划是让引擎处理用户输入,然后将适当的音频和视频输出到扬声器和监视器。我在想我会有一个指向要在屏幕上绘制的下一个位图的全局指针,游戏引擎和渲染器的代码将是这样的:
ALLEGRO_BITMAP *nextBitmap;
boolean using;
void GameEngine ()
{
ALLEGRO_BITMAP *oldBitmap;
while (ContinueGameEngine())
{
ALLEGRO_BITMAP *bitmap = al_create_bitmap (width, height);
MakeTheBitmap (bitmap);
while (using) ; //The other thread is using the bitmap. Don't mess with it!
al_destroy_bitmap (nextBitmap);
nextBitmap = bitmap;
}
}
void Renderer ()
{
while (ContinueRenderer())
{
ALLEGRO_BITMAP *bitmap = al_clone_bitmap (nextBitmap);
DrawBitmapOnScreen (bitmap);
}
}
这似乎不稳定......也许在调用时会发生一些事情,al_clone_bitmap
但我不太确定如何处理这样的事情。我会在位图上使用互斥锁,但互斥锁似乎需要时间来锁定和解锁,我希望这两个线程(尤其是游戏引擎线程)尽可能快地运行。我还阅读了一种称为条件的东西,但我完全不知道条件将如何适用或有用,尽管我确信它们是。有人可以指点我关于互斥锁和条件的教程(最好是 POSIX,而不是 Windows),这样我就可以尝试解决所有这些问题吗?