我正在开发一个看起来像这样的图形应用程序:
while (Simulator.simulating)
{
Simulator.update();
InputManager.processInput();
VideoManager.draw();
}
我每秒都这样做几次,在绝大多数情况下,我的计算将占用我处理时间的90-99%。我想要做的是取出processInput并绘制函数,让每个函数独立运行。
这样,我可以让输入线程始终检查输入(以合理的速率),并且绘制线程尝试以给定的帧速率重绘。
模拟器已经(内部)多线程,并且多个线程写入相同数据(每个线程处理一个段)没有问题。
我的问题是我不确定如何正确地做到这一点。我如何正确初始化我的pthread_t和关联的pthread_attr_t,以便线程运行而不阻塞我正在做的事情?换句话说,我怎样才能创建两个线程,每个线程都运行一个无限循环?
为了进一步概括,我正试图弄清楚如何做到这一点:
for (int i = 0; i < threads; i++)
pthread_create(&th[i], NULL, func[i], NULL)
for (int i = 0; i < threads; i++)
pthread_join(th[i], NULL);
其中func [i]是一个任意函数,它在无限循环中运行一些任意的东西。
感谢任何帮助甚至链接,谢谢!
编辑:我应该提到它是一个交互式模拟器,所以我需要有两个无限循环运行,彼此独立。我似乎只能马上跑。
答案 0 :(得分:1)
双缓冲是你的朋友。有2个数据缓冲区。一个是绘图缓冲区,一个是计算缓冲区。完成计算后,等待当前绘制完成,然后交换缓冲区。现在,在计算下一帧数据时,它将继续绘制新计算的数据。绘图和模拟现在几乎完全解耦......
答案 1 :(得分:0)
首先,我建议使用boost::thread而不是pthreads,因为您使用的是C ++。使用boost::thread
,您可以执行以下操作:
#include <boost/thread.hpp>
void input_thread()
{
//...
}
void draw_thread()
{
//...
}
int main()
{
boost::thread input_th(&input_thread);
boost::thread draw_th(&draw_thread);
input_th.join();
draw_th.join();
return 0;
}
boost::thread
的构造函数会自动生成一个新线程并调用传入的函数。您还可以使用boost::bind将成员函数用作线程。 join函数会阻塞,直到线程退出。这是必要的,因为如果main()
退出,则所有线程都将被终止。
希望这会让你开始,但困难的部分是同步(在线程之间共享数据)。我建议你查看documentation的互斥和条件变量。请记住,您需要确保只有一个线程同时写入同一个内存位置。互斥体有助于解决这个问题。条件变量有助于您在线程之间发出信号并等待信号。
例如,在输入线程中,您可以使用输入填充缓冲区,然后使用条件变量向绘制线程发信号通知输入已准备就绪。在每个线程中,应该在访问缓冲区时锁定互斥锁,以便在绘制线程尝试读取它时不会被输入线程覆盖。正如Goz建议的那样,双缓冲区可以使这更容易,也可能更有效。