【问题标题】:Wake Thread On Signal唤醒线程信号
【发布时间】:2010-06-17 14:06:43
【问题描述】:

我有一个将实时动画绘制到 gtkmm 窗口的程序。我有我的主线程 gui 线程和一个使用 cairo 将动画帧渲染到图像表面的工作线程。工作线程每 33 毫秒由主线程发出信号。现在,当必须渲染帧时,我的应用程序会在每次超时时创建一个新的渲染线程。我该如何创建一种线程池,在该线程池中,gui线程中的超时向我的工作线程发出信号以唤醒并渲染一个帧,该帧向gui线程发出该帧已完成的信号,然后返回睡眠并等待再次发出信号。

【问题讨论】:

    标签: c++ multithreading gtkmm


    【解决方案1】:

    我不是渲染和 cairo 方面的专家,但线程通常可以相互发出信号。更简单的方法是使用条件变量或互斥锁。您的所有工作线程都可以在互斥锁上等待,GUI 线程可以在超时时释放互斥锁,GUI 线程本身可以在另一个线程上等待。获取互斥体的工作线程可以渲染帧和信号GUI线程,然后可以返回到第一个互斥体等待来自GUI线程的下一个信号。

    【讨论】:

    • 是的,我认为跨线程信号将是最好的方法。也许 Glib::Dispatcher 是我完成这项工作所需要的
    【解决方案2】:

    您可以使用master-worker 方法,其中主线程是处理要呈现的帧的master,而workers 是从工作线程的pool 中提取的。

    DevGuy 提供了一个公共域 thread pool 实现供您使用。

    我认为这样的事情应该可行:

    #include <dg/dg.h>
    #include <dg/thread/threadpool.h>
    #include <dg/thread/impl.h>
    #include <dg/impl.h>
    #include <boost/bind.hpp>
    
    // a mutex is needed if the workers touch shared data
    boost::mutex mutex;
    
    struct work
    {
        void operator ()()
        {
            boost::mutex::scoped_lock lock(mutex);
    
            // this is where a worker does its thing
        }
    
        worker(/* your constructor params */)
        {
            // ...
        }
    
        worker(const worker &w)
        {
            // ...
        }    
    
        // internal work data
    };
    
    int main(int argc, char* argv[])
    {
        // a pool with 5 threads that ca queue up to 100 jobs
        dg::thread::ThreadPool pool(5,100);
    
        for (;;)
        {
            // create a piece of work
            work w;
    
            // execute the work
            pool.invoke(w);
    
            // some exit condition
        }
    
        // wait for unfinished work
        pool.wait();
    }
    

    这是example的另一种用法。

    【讨论】:

      猜你喜欢
      • 2015-09-16
      • 1970-01-01
      • 2015-07-05
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多