C++ 队列函数调用

C++ Queuing function calls

我有一个函数可以将要在另一个线程中执行的函数回调排队。

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();
});

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