MST
星途 面试题库

面试题:C++ 字符串函数专家难度题

在多线程环境下使用C++ 字符串函数(如 `std::string` 的相关操作)时,会面临哪些线程安全问题?请详细阐述,并提出至少两种有效的解决方案,同时说明每种方案的优缺点。假设在一个服务器程序中,多个线程频繁地对共享的字符串数据进行读取和写入操作,设计一个线程安全的字符串操作模块,并编写关键代码片段。
15.6万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

线程安全问题

  1. 数据竞争:多个线程同时对 std::string 进行读写操作,可能导致未定义行为。例如,一个线程正在修改字符串内容,另一个线程同时读取,可能读到不一致的数据。
  2. 资源竞争std::string 内部管理动态内存,多线程操作可能导致内存分配和释放的竞争,如内存泄漏、重复释放等问题。

解决方案

  1. 互斥锁(Mutex)
    • 优点:实现简单,适用范围广,可以有效保护共享资源。
    • 缺点:性能开销较大,因为每次访问共享资源都需要获取锁,可能导致线程阻塞,降低并发性能。
  2. 读写锁(Read - Write Lock)
    • 优点:允许多个线程同时进行读操作,只有写操作时才需要独占锁,提高了读多写少场景下的并发性能。
    • 缺点:实现相对复杂,需要仔细设计读锁和写锁的获取与释放逻辑,否则容易出现死锁等问题。

线程安全的字符串操作模块关键代码片段

#include <iostream>
#include <string>
#include <mutex>
#include <shared_mutex>

class ThreadSafeString {
public:
    void write(const std::string& newStr) {
        std::unique_lock<std::shared_mutex> lock(mutex_);
        str_ = newStr;
    }

    std::string read() {
        std::shared_lock<std::shared_mutex> lock(mutex_);
        return str_;
    }

private:
    std::string str_;
    std::shared_mutex mutex_;
};