调用 std::packaged_task::get_future() 时可能出现的竞争条件

Possible race condition when invoking std::packaged_task::get_future()

看到这里 document,有一个演示片段:

std::packaged_task<int()> task([]{ return 7; }); // wrap the function
std::future<int> f1 = task.get_future();  // get a future
std::thread t(std::move(task)); // launch on a thread

我的问题是,如果我这样重写代码片段,是否存在任何潜在问题(竞争条件):

std::packaged_task<int()> task([]{ return 7; }); // wrap the function
std::thread t(std::move(task)); // firstly launch on a thread, and then gets a future
std::future<int> f1 = task.get_future();  // get a future

UPDATED1:我理解尼可波拉斯的回答,有没有潜力 问题(竞争条件)如果我这样重写代码片段:

std::packaged_task<int()> task([]{ return 7;});
thread_callablefunc_queue.push_back(task);  //task may be popped and run by another thread at once, queue is protected by mutex.
std::future<int> f1 = task.get_future();  // get a future

让我担心的是 task 可能会被 另一个线程 立即调用 当前线程正在调用task.get_future() .

是的,有问题。您移动了 task。你的线程不再有它了;此时的 task 变量处于 valid-but-unspecified 状态。你不能要求它的未来,因为它不代表有问题的任务......因为你移动了它。

这不是竞争条件;它在功能上与此没有什么不同:

std::packaged_task<int()> task([]{ return 7; });
auto t(std::move(task));
std::future<int> f1 = task.get_future();

task 已被移除,因为那是你要求的。