MST

星途 面试题库

面试题:C++ 中 const char *p 与 char * const p 在复杂数据结构及多线程环境下的错误隐患探讨

在一个多线程环境中,有一个类 `MyClass` 包含一个成员变量 `char * const data`,并且有多个线程可能会访问和修改 `data` 指向的数据。请分析可能出现的错误场景,并给出一个可行的解决方案来保证数据的一致性和安全性,同时阐述在这种场景下 `const char *p` 与 `char * const p` 的使用差异及影响。
42.6万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

可能出现的错误场景

  1. 数据竞争:多个线程同时访问和修改 data 指向的数据,可能导致数据不一致,例如一个线程正在写入数据,另一个线程同时读取,读到的是部分修改的数据。

可行的解决方案

  1. 使用互斥锁(Mutex)
    • MyClass 类中添加一个 std::mutex 成员变量,例如 std::mutex mtx;
    • 在所有访问和修改 data 指向数据的成员函数中,使用 std::lock_guardstd::unique_lock 来锁定和解锁互斥锁。示例代码如下:
#include <iostream>
#include <mutex>
class MyClass {
private:
    char * const data;
    std::mutex mtx;
public:
    MyClass(char* initialData) : data(initialData) {}
    void modifyData(char newChar, int index) {
        std::lock_guard<std::mutex> lock(mtx);
        if (index >= 0 && data[index] != '\0') {
            data[index] = newChar;
        }
    }
    char readData(int index) {
        std::lock_guard<std::mutex> lock(mtx);
        if (index >= 0 && data[index] != '\0') {
            return data[index];
        }
        return '\0';
    }
};

const char *pchar * const p 的使用差异及影响

  1. const char *p
    • 含义:指针 p 可以指向不同的 char 数据,但不能通过 p 修改其所指向的数据。即数据是常量,指针可变。
    • 影响:在多线程环境中,如果多个线程只读取 p 指向的数据,不修改,那么不会出现数据竞争问题,无需额外同步机制。但如果某个线程尝试通过 p 修改数据,编译器会报错。
  2. char * const p
    • 含义:指针 p 一旦初始化,就不能再指向其他 char 数据,但可以通过 p 修改其所指向的数据。即指针是常量,数据可变。
    • 影响:在多线程环境中,由于数据可变,多个线程同时访问和修改 p 指向的数据会导致数据竞争,需要同步机制(如上述的互斥锁)来保证数据一致性和安全性。