根据 Herb Sutter ( http://isocpp.org/blog/2012/12/you-dont-know-const-and-mutable-herb-sutter ),在 C++11 中, const 方法不得更改对象位-明智的,或者如果它们具有可变数据成员,则必须执行内部同步(例如,使用互斥锁)。
假设我有一个从多个线程访问的全局对象,并假设它具有可变成员。为了论证起见,我们假设我们不能修改类的来源(它是由第三方提供的)。
在 C++98 中,这些线程将使用全局互斥锁来同步对该对象的访问。因此,访问将需要一个互斥锁/解锁。
但是,在 C++11 中,对该对象的任何 const 成员函数调用也将调用内部同步,因此,对该对象的单个 const 函数调用可能会花费 2 次锁定/解锁操作(或更多,取决于函数的数量您从单个线程调用)。请注意,仍然需要全局互斥锁,因为 const 似乎对编写器没有任何作用(如果非 const 方法之一调用 const 方法,可能还会减慢它们的速度)。
所以,我的问题是:如果我们所有的类都必须在 C++ 中采用这种方式(至少可以被 STL 使用),这不会导致过多的同步措施吗?
谢谢
编辑:一些澄清:
似乎在 C++11 中,除非其 const 成员函数在内部同步(或不执行任何写入),否则您不能将类与标准库一起使用。
虽然 C++11 本身不会自动添加任何同步代码,但符合标准库的类在 C++98 中不需要同步,但在 C++11 中需要。因此,在 C++98 中,您可以不为可变成员进行任何内部同步,但在 C++11 中则不能。