【发布时间】:2020-08-15 07:46:12
【问题描述】:
我尝试将具有返回值的任务推送到线程池:
template<class Function>
auto enqueue(Function&& f)
{
using ReturnType = std::result_of_t<std::decay_t<Function>()>;
std::promise<ReturnType> ret_promise;
auto fut = ret_promise.get_future();
auto task = UniqueFunction<void()>(
[do_it = std::move(f), ret = std::move(ret_promise)]() mutable {
ret.set_value(do_it());
});
{
std::lock_guard lock{m_mtx};
m_tasks.push(std::move(task));
m_cv.notify_one();
}
return fut;
}
循环看起来像这样:
void performTasks()
{
while(true)
{
std::unique_lock<std::mutex> lock{m_mtx};
m_cv.wait(lock, [this]() { return !m_tasks.empty() || m_terminate; });
if(!m_tasks.empty())
{
auto task = std::move(m_tasks.front());
m_tasks.pop();
lock.unlock();
task();
}
else
{
return;
}
}
}
Helgrind 在尝试等待结果时抱怨数据竞争:
线程 #1 在 0x5DFB618 读取大小为 8 时可能出现数据争用
这与线程 #2 先前写入的大小为 8 的冲突
这是误报还是上面的实现有问题?
【问题讨论】:
-
请发布一个完整的工作示例。
标签: c++ multithreading promise future