线程安全问题
- 数据竞争:多个线程同时对
std::string
进行读写操作,可能导致未定义行为。例如,一个线程正在修改字符串内容,另一个线程同时读取,可能读到不一致的数据。
- 资源竞争:
std::string
内部管理动态内存,多线程操作可能导致内存分配和释放的竞争,如内存泄漏、重复释放等问题。
解决方案
- 互斥锁(Mutex)
- 优点:实现简单,适用范围广,可以有效保护共享资源。
- 缺点:性能开销较大,因为每次访问共享资源都需要获取锁,可能导致线程阻塞,降低并发性能。
- 读写锁(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_;
};