我目前正在使用跨平台库Allegro开发一款C语言的独立游戏。我打算将输入、声音、游戏引擎和图形等内容分别放在不同的线程中,以增强程序的鲁棒性。由于我没有任何多线程经验,我的问题是:
如果我有一段数据在内存中(比如指向一个数据结构的指针),一个线程随意写入它,另一个线程随意读取它,这样做是否可以,还是每个线程都必须使用互斥锁来锁定内存,然后读取或写入,然后解锁?
特别是,我在考虑游戏引擎和视频渲染器之间的交互。(这是2D游戏)我的计划是让引擎处理用户输入,然后输出适当的音频和视频到扬声器和显示器。我想要一个全局指针指向下一个要在屏幕上绘制的位图,游戏引擎和渲染器的代码可能像这样:
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),这样我就可以尝试弄清楚所有这些了吗?
al_clone_bitmap()
... 但是您不应该在每个帧上都这样做。在我看来,您不应该寻找使用更多线程的原因。 - Matthew