C++标准库提供以下类型保证(除非另有说明):
(1) 读操作(即对
(2) 只要每个对象一次只被一个线程访问,多个线程可以同时读写任意对象。
标准库要求用户类型具有相同的保证。(您可以在GotW #95中阅读有关此内容的信息,或观看Herb at C++ and Beyond 2012解释此内容。)
现在我的问题是,以下结论是否正确:由于
这种推理是否正确?如果正确,那么当前的实现是否符合要求?
(1) 读操作(即对
const
对象的操作)是线程安全的。这意味着多个线程可以同时从一个对象中读取,而不会发生竞争条件,只要没有线程同时对该对象进行写入(应用非const
操作)。(2) 只要每个对象一次只被一个线程访问,多个线程可以同时读写任意对象。
标准库要求用户类型具有相同的保证。(您可以在GotW #95中阅读有关此内容的信息,或观看Herb at C++ and Beyond 2012解释此内容。)
现在我的问题是,以下结论是否正确:由于
std::function
的operator()
是一个const
成员函数,因此需要确保线程安全。如果在构造函数中传递的函数对象具有const operator()
成员函数,则std::function
对象可以假定其为线程安全并直接转发调用。但是,如果在构造函数中传递给它的函数对象具有可变的operator()
,则该操作不需要是线程安全的,但std::function
仍然需要是线程安全的,因为调用运算符仍然是const。因此,std::function
必须在外部同步调用存储的可变函数对象,并因此使用互斥锁。这意味着,在将可变lambda传递给std::function
的构造函数时会产生性能开销。这种推理是否正确?如果正确,那么当前的实现是否符合要求?