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 使用虚拟调用调用函数,这会影响性能。考虑到这些事实,我认为第一个版本更好。
我有一个函数可以将要在另一个线程中执行的函数回调排队。
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 使用虚拟调用调用函数,这会影响性能。考虑到这些事实,我认为第一个版本更好。