使用pthreads创建一个独立的绘制线程(C ++)

时间:2010-04-20 06:53:36

标签: c++ pthreads

我正在开发一个看起来像这样的图形应用程序:

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]是一个任意函数,它在无限循环中运行一些任意的东西。

感谢任何帮助甚至链接,谢谢!

编辑:我应该提到它是一个交互式模拟器,所以我需要有两个无限循环运行,彼此独立。我似乎只能马上跑。

2 个答案:

答案 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建议的那样,双缓冲区可以使这更容易,也可能更有效。