C++ 使用pthreads(C+;+;)创建独立的绘图线程

C++ 使用pthreads(C+;+;)创建独立的绘图线程,c++,pthreads,C++,Pthreads,我正在开发一个图形应用程序,它看起来像这样: while (Simulator.simulating) { Simulator.update(); InputManager.processInput(); VideoManager.draw(); } #include <boost/thread.hpp> void input_thread() { //... } void draw_thread() { //... } int mai

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

while (Simulator.simulating)
{
    Simulator.update();
    InputManager.processInput();
    VideoManager.draw();
}
#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;
}
我一秒钟做几次,在绝大多数情况下,我的计算将占用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);
for(int i=0;i
其中func[i]是在无限循环中运行的任意函数,执行任意操作

任何帮助或链接都将不胜感激,谢谢


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

双缓冲区是您的朋友。有2个数据缓冲区。一个是绘图缓冲区,一个是计算缓冲区。完成计算后,等待当前绘图完成,然后交换缓冲区。现在,在计算下一帧数据时,它将继续绘制新计算的数据。绘图和模拟现在几乎完全解耦…

双缓冲是您的朋友。有2个数据缓冲区。一个是绘图缓冲区,一个是计算缓冲区。完成计算后,等待当前绘图完成,然后交换缓冲区。现在,在计算下一帧数据时,它将继续绘制新计算的数据。绘图和模拟现在几乎完全解耦了…

因为我建议使用与pTrices相反的,因为你使用C++。使用
boost::thread
可以执行以下操作:

while (Simulator.simulating)
{
    Simulator.update();
    InputManager.processInput();
    VideoManager.draw();
}
#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;
}
#包括
无效输入_线程()
{
//...
}
无效绘制螺纹()
{
//...
}
int main()
{
boost::线程输入线程(&input\u线程);
boost::线程draw_th(&draw_线程);
输入_th.join();
绘制连接();
返回0;
}
boost::thread
的构造函数自动生成一个新线程并调用传入的函数。还可以通过使用将成员函数用作线程。join函数一直阻塞,直到线程退出。这是必要的,因为如果退出
main()
,所有线程都将被终止

希望这能让您开始,但最困难的部分是同步(在线程之间共享数据)。我建议您查看互斥体和条件变量的定义。请记住,您需要确保一次只有一个线程写入同一内存位置。互斥体有助于解决这个问题。条件变量通过允许您在线程之间发送信号和等待信号来提供帮助


例如,在输入线程中,您可以使用输入填充缓冲区,然后使用条件变量向绘图线程发出输入就绪的信号。在每个线程中,访问缓冲区时应锁定互斥体,以便在绘图线程尝试读取缓冲区时不会被输入线程覆盖。正如GOZ所建议的,双缓冲将使这更容易,也可能更有效。

首先,我建议使用与PthOpTy相反的,因为您使用C++。使用

boost::thread
可以执行以下操作:

while (Simulator.simulating)
{
    Simulator.update();
    InputManager.processInput();
    VideoManager.draw();
}
#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;
}
#包括
无效输入_线程()
{
//...
}
无效绘制螺纹()
{
//...
}
int main()
{
boost::线程输入线程(&input\u线程);
boost::线程draw_th(&draw_线程);
输入_th.join();
绘制连接();
返回0;
}
boost::thread
的构造函数自动生成一个新线程并调用传入的函数。还可以通过使用将成员函数用作线程。join函数一直阻塞,直到线程退出。这是必要的,因为如果退出
main()
,所有线程都将被终止

希望这能让您开始,但最困难的部分是同步(在线程之间共享数据)。我建议您查看互斥体和条件变量的定义。请记住,您需要确保一次只有一个线程写入同一内存位置。互斥体有助于解决这个问题。条件变量通过允许您在线程之间发送信号和等待信号来提供帮助


例如,在输入线程中,您可以使用输入填充缓冲区,然后使用条件变量向绘图线程发出输入就绪的信号。在每个线程中,访问缓冲区时应锁定互斥体,以便在绘图线程尝试读取缓冲区时不会被输入线程覆盖。正如Goz所建议的,双缓冲区将使这更容易,而且可能更有效。

我不确定问题中是否有足够的信息来获得满意的答案。围绕着设计线程以使它们彼此表现良好的问题与线程的创建方式无关。这些问题与每个线程调用的方法以及这些方法处理并发性的程度有关。如果绘图只是将模拟器的输出转储到屏幕上,那么升级屏幕的速度没有比模拟器更快的意义。update()运行。同样,如果模拟器每次运行只接受一次输入,则t