[英]Creating an independent draw thread using pthreads (C++)
我正在开发一个图形应用程序,它看起来像这样:
while (Simulator.simulating)
{
Simulator.update();
InputManager.processInput();
VideoManager.draw();
}
我每秒这样做几次,并且在大多数情况下,我的计算将占用我90-99%的处理时间。 我想做的是取出processInput和draw函数,并使每个函数独立运行。
这样,我可以让输入线程始终检查输入(以合理的速率),而绘制线程尝试以给定的帧速率重新绘制。
该模拟器已经(内部)是多线程的,并且多个线程写入同一数据没有问题(每个线程处理一个段)。
我的问题是我不确定如何正确执行此操作。 如何正确初始化我的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]是一些任意函数,它在无限循环中运行以执行某些任意操作。
任何帮助,甚至链接,不胜感激,谢谢!
编辑:我应该提到这是一个交互式模拟器,因此我确实需要有两个彼此独立运行的无限循环。 我似乎只能一次跑步。
双缓冲是您的朋友。 有2个数据缓冲区。 一种是绘图缓冲区,一种是计算缓冲区。 完成计算后,请等待当前绘制完成,然后再交换缓冲区。 现在,当您计算下一帧数据时,它将继续绘制新计算的数据。 现在,绘图和模拟几乎完全解耦了...
首先,我建议使用boost :: thread而不是pthread,因为您使用的是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将成员函数用作线程。 连接功能将阻塞,直到线程退出。 这是必需的,因为如果main()
退出,则将杀死所有线程。
希望这可以帮助您入门,但是最困难的部分是同步(在线程之间共享数据)。 我建议您查看互斥和条件变量的文档 。 请记住,您需要确保仅一个线程一次写入同一内存位置。 互斥体可以解决此问题。 条件变量通过允许您在线程之间发信号并等待信号来提供帮助。
例如,在输入线程中,您可以使用输入填充缓冲区,然后使用条件变量向绘制线程发送信号,表明输入已准备就绪。 在每个线程中,访问缓冲区时均应锁定一个互斥体,以使在绘制线程尝试读取该互斥体时,它不会被输入线程覆盖。 正如Goz所建议的,双缓冲区将使此操作更容易并且可能更有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.