面试题答案
一键面试1. const char *p
和 char * const p
的分析
const char *p
:- 内存安全:指向的内容不可通过此指针修改,这在多线程环境下可以防止一个线程意外修改字符串内容影响其他线程读取,提高内存安全性。
- 数据一致性:由于内容不可改,多个线程读取时能保证数据一致性。
- 性能优化:在多线程读取时,因为内容不变,无需额外同步机制,性能较好。但如果涉及写入操作,会需要额外处理方式。
char * const p
:- 内存安全:指针本身指向不可变,但指向的内容可变。如果多线程同时写该指针指向的内容,可能导致内存安全问题,如数据竞争。
- 数据一致性:多线程写入时,可能导致数据不一致。因为没有同步机制时,不同线程写入顺序和时机不同。
- 性能优化:如果涉及写入操作,为保证数据一致性,需要同步机制,这会带来一定性能开销。
2. 设计思路
- 只读场景:使用
const char *p
,因为此时字符串不需要修改,能保证内存安全和数据一致性,且性能最优。 - 读写场景:可以将字符串分为一个只读部分和一个可写部分。只读部分用
const char *
指向,多线程可安全读取。可写部分在需要修改时,使用同步机制(如互斥锁)来保证数据一致性。例如,在修改前获取锁,修改完成后释放锁。
3. 代码示例
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
const char *readOnlyStr = "Initial String";
char writeableStr[100];
void readThread() {
std::cout << "Read thread: " << readOnlyStr << std::endl;
}
void writeThread() {
std::lock_guard<std::mutex> lock(mtx);
std::snprintf(writeableStr, sizeof(writeableStr), "New String Modified by Thread");
readOnlyStr = writeableStr;
}
int main() {
std::thread reader(readThread);
std::thread writer(writeThread);
reader.join();
writer.join();
std::cout << "Final String: " << readOnlyStr << std::endl;
return 0;
}
在上述代码中:
readOnlyStr
作为只读部分,使用const char *
类型,多线程读取时无需同步。writeableStr
用于可写部分,writeThread
在修改writeableStr
并更新readOnlyStr
指向时,通过std::mutex
保证数据一致性。