在收到关于登录不同线程的上一个问题的答案后,我目前处于以下代码位(注意:这里的 concurrent_queue 来自 ppl,但任何其他 concurrent_queue 都应该工作):
class concurrentFuncQueue
{
private:
typedef std::function<void()> LambdaFunction;
mutable concurrency::concurrent_queue<LambdaFunction> functionQueue;
mutable std::atomic<bool> endcond;
LambdaFunction function;
std::thread thd;
public:
concurrentFuncQueue() : endcond(false), thd([=]{
while (endcond != true)
{
if (functionQueue.try_pop( function ))
{
function(); //note: I am popping a function and adding () to execute it
}
}
}){}
~concurrentFuncQueue() { functionQueue.push([=]{ endcond = true; }); thd.join(); }
void pushFunction(LambdaFunction function) const { functionQueue.push(function); }
};
基本上,我推送的函数在不同的线程上按顺序运行(例如日志记录函数),以避免主线程上的性能问题。
目前的使用情况如下:
static concurrentFuncQueue Logger;
vector<char> outstring(256);
Logger.pushFunction([=]{ OutputDebugString(debugString.c_str()) });
到目前为止很棒。我可以将函数推送到并发队列中,该队列将在单独的线程上按顺序运行我的函数。
我还需要拥有一件事,但目前不是返回值,因此前(伪代码):
int x = y = 3;
auto intReturn = Logger.pushFunction([=]()->int { return x * y; });
将 x * y 推入并发队列,并在函数弹出并完成后(在另一个线程上),将计算出的值返回给调用者线程。
(我知道我会阻塞调用者线程,直到返回推送的函数。这正是我想要的)
我觉得我可能不得不使用类似于 std::promise 的东西,但遗憾的是,我目前对它们的理解不足,使我无法制定可编码的东西。
有任何想法吗?对上述 C++ 代码的思考和任何其他评论也非常受欢迎(如果您觉得另一种实现更合适或解决问题,请完全忽略代码)。