调用 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
已被移除,因为那是你要求的。
看到这里 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
已被移除,因为那是你要求的。