MST

星途 面试题库

面试题:C++中const成员函数线程安全基础

在C++中,简要说明为什么const成员函数理论上更容易保证线程安全?列举一个场景,在该场景下一个看似线程安全的const成员函数实际并非线程安全,并解释原因。
35.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

为什么const成员函数理论上更容易保证线程安全

  1. 概念理解
    • const成员函数承诺不修改对象的成员变量(除非这些成员变量被声明为mutable)。这意味着在多线程环境下,const成员函数不会改变对象的状态,从而减少了数据竞争的可能性。
    • 数据竞争通常发生在多个线程同时访问和修改同一数据时,而const成员函数的只读性质使得它不太可能引发这种竞争。例如,假设有一个类MyClass
    class MyClass {
    public:
        int getValue() const {
            return value;
        }
    private:
        int value;
    };
    
    在多线程环境下,多个线程可以安全地调用getValue函数,因为它不会修改value,不会产生数据竞争。

看似线程安全的const成员函数实际并非线程安全的场景及原因

  1. 场景
    • 考虑一个用于统计函数调用次数的类CallCounter
    class CallCounter {
    public:
        int getCallCount() const {
            return callCount;
        }
    private:
        mutable int callCount;
    };
    
    这里getCallCount是一个const成员函数,因为它需要返回callCount的值,而callCount被声明为mutable以便在const成员函数中可以修改它。
  2. 原因
    • 在多线程环境下,虽然getCallCountconst成员函数,但它读取的callCount可能在其他线程中被修改。例如,如果一个线程正在调用getCallCount读取callCount的值,而另一个线程同时在增加callCount的值,就会发生数据竞争。
    • 这里callCount虽然是为了在const函数中修改而设为mutable,但它的并发访问没有进行同步保护(如使用互斥锁等机制),所以看似线程安全的const成员函数getCallCount实际上并非线程安全。