面试题答案
一键面试设计思路
- 互斥锁(Mutex):使用互斥锁来保护共享字符串。在对字符串进行任何操作(读取或修改)之前,线程必须先获取互斥锁,操作完成后释放互斥锁。这样可以确保同一时间只有一个线程能访问和操作共享字符串,避免数据竞争。
- 条件变量(Condition Variable):如果涉及到线程间的协作,例如某个线程需要等待共享字符串达到特定状态才能继续操作,可以使用条件变量。一个线程在满足条件时通知其他等待的线程,等待的线程在收到通知后重新检查条件并决定是否继续操作。
关键代码片段(以C++为例)
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <string>
std::mutex mtx;
std::condition_variable cv;
std::string sharedString;
bool ready = false;
void modifyString(const std::string& newStr) {
std::unique_lock<std::mutex> lock(mtx);
sharedString = newStr;
ready = true;
lock.unlock();
cv.notify_all();
}
void readString() {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []{return ready;});
std::cout << "Read string: " << sharedString << std::endl;
}
在主函数中可以这样调用:
int main() {
std::thread t1(modifyString, "Hello, World!");
std::thread t2(readString);
t1.join();
t2.join();
return 0;
}
额外注意事项
- 内存管理:在多线程环境下,要特别注意字符串指针所指向内存的生命周期。如果一个线程释放了字符串所占用的内存,而其他线程还持有该指针进行操作,会导致悬空指针和未定义行为。
- 线程安全函数:确保使用的字符串操作函数(如
strcpy
、strcat
等)是线程安全的。如果不是,需要使用同步机制保护其操作。 - 数据一致性:不仅要保证对字符串的读写操作是原子的,还要保证字符串作为一个整体的数据一致性。例如,在修改字符串时,要确保其他线程看到的是完整修改后的结果,而不是修改过程中的中间状态。
- 死锁预防:在使用多个同步原语(如互斥锁、条件变量等)时,要小心死锁的发生。确保加锁和解锁的顺序正确,避免出现循环等待的情况。