【发布时间】:2019-10-14 17:00:58
【问题描述】:
std::function::operator= 和 std::function::operator() 可以同时调用吗?
在线程一上执行std::function::operator=而在线程二上执行std::function::operator()是未定义的行为吗?
我假设这可能是一个原子操作,我们不能在调用哪个函数之间进行中间操作。我不关心哪个运行,只是我们没有处于某种无效状态。
【问题讨论】:
-
如果你改写这个问题,我希望答案变得显而易见。诸如“我可以在分配新功能的同时执行功能吗?”或者也许“我可以在用程序 y 替换它的同时运行程序 x 吗?”
-
"[res.on.objects]/1 如果从不同线程调用标准库函数可能会引入数据竞争,则程序的行为是不确定的。条件下这可能发生在 20.5.5.9 中。 [注意:修改在线程之间共享的标准库类型的对象有未定义行为的风险,除非该类型的对象被明确指定为可共享而没有数据争用或用户提供锁定机制。——尾注]"
-
@IgorTandetnik 我能得到这个答案吗?
-
如果
std::function包含一个 lambda,则重新分配std::function将在旧 lambda 仍在执行时释放它。即使它不包含 lambda,在operator()试图决定要做什么时分配它也会导致混乱(在旧对象上调用新分配的成员函数,或调用部分分配的函数指针) . -
@RaymondChen 这个事实很有趣。如果我使用绑定会是真的吗?
标签: c++ multithreading c++11 std-function