#include <iostream>
#include <memory>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mtx;
std::condition_variable cv;
std::unique_ptr<char[]> currentData;
bool dataReady = false;
void threadA() {
while (true) {
// 模拟获取新数据
std::unique_ptr<char[]> newData(new char[100]);
// 填充数据
for (int i = 0; i < 100; ++i) {
newData[i] = 'a' + i % 26;
}
{
std::unique_lock<std::mutex> lock(mtx);
currentData = std::move(newData);
dataReady = true;
}
cv.notify_one();
// 模拟其他工作
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
void threadB() {
while (true) {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [] { return dataReady; });
const char* dataToProcess = currentData.get();
// 调用接受const char*参数的函数
std::cout << "Thread B processing data: ";
for (int i = 0; i < 100; ++i) {
std::cout << dataToProcess[i];
}
std::cout << std::endl;
dataReady = false;
}
}
int main() {
std::thread a(threadA);
std::thread b(threadB);
a.join();
b.join();
return 0;
}
设计解释
- 数据存储:
- 使用
std::unique_ptr<char[]>
来管理动态分配的内存,避免内存泄漏。std::unique_ptr
在其析构时会自动释放所管理的内存。
- 同步机制:
std::mutex
mtx
用于保护共享资源currentData
和dataReady
,防止数据竞争。
std::condition_variable
cv
用于线程间的通信。线程B在cv.wait
处等待,直到线程A更新数据并通过cv.notify_one
唤醒线程B。
- 线程A的工作:
- 线程A不断分配新的内存块,填充数据。
- 使用
std::unique_lock<std::mutex>
来锁定互斥量mtx
,将newData
转移给currentData
,并设置dataReady
为true
。
- 解锁互斥量并通过
cv.notify_one
通知线程B数据已准备好。
- 线程B的工作:
- 线程B在
cv.wait
处等待,直到dataReady
为true
。
- 锁定互斥量
mtx
,获取currentData
指向的数据并调用接受const char*
参数的函数(这里简单地将数据打印出来)。
- 处理完数据后,将
dataReady
设为false
,解锁互斥量,继续等待下一次数据更新。
- 内存管理:
- 由于
std::unique_ptr
的使用,当currentData
被新的数据替换时,旧的数据会自动释放,避免了内存泄漏。同时,在threadA
和threadB
中,通过互斥量和条件变量的配合,保证了数据的安全访问。