代码之家  ›  专栏  ›  技术社区  ›  Zach

C++排队函数调用

  •  0
  • Zach  · 技术社区  · 4 年前

    我有一个函数,它将函数回调排队,以便在另一个线程中执行。

    void Queue(std::function<void()> callback)
    {
        std::lock_guard<std::mutex> lock(queueMutex);
        queue.push_back(callback);
    }
    

    在主线程中使用此函数调用排队函数:

    void ProcessQueue()
    {
        std::lock_guard<std::mutex> lock(queueMutex);
        if (!queue.empty()) 
        {
            for (auto& cb : queue) 
            {
                cb();
            }
            queue.clear();
        }
    }
    

    我正在对这些回调进行排队,因为它们必须在主线程中执行。我的问题是,在一个单一的功能中链接多个功能是否安全(和适当) Queue 呼叫,就像这样:

    Queue([=]()
    {
        FunctionA();
        FunctionB();
    });
    

    还是像这样把它们分开更好?

    Queue([=]()
    {
        FunctionA();
    });
    
    Queue([=]()
    {
        FunctionB();
    });
    
    0 回复  |  直到 4 年前
        1
  •  0
  •   Argishti Ayvazyan    4 年前

    我会选择第一种选择。在第二个版本中,创建和调用lambda的额外成本。由于您使用的是按值捕获[=],因此在捕获重物时可能会非常昂贵。 std::函数也会影响性能。 第二个版本使用两个std::function复制带有捕获参数的lambdas进行调用,这里使用了更多的内存,加上std::function使用虚拟调用调用函数,这会影响性能。考虑到这些事实,在我看来,第一个版本更好。