#include <iostream>
#include <mutex>
#include <string>
#include <thread>
std::mutex mtx; // 创建一个互斥锁
std::string sharedData; // 共享数据
void writeData() {
for (int i = 0; i < 5; ++i) {
// std::lock_guard<std::mutex> lock(mtx); // 锁住互斥锁
// 写入共享数据
sharedData = "start=> ";
sharedData += std::to_string(i);
std::this_thread::sleep_for(std::chrono::milliseconds(60)); // 模拟写入过程中的延迟
sharedData += " <=end!\n";
std::cout << "Write data: " << i << std::endl;
}
}
void readData() {
for (int i = 0; i < 5; ++i) {
// std::lock_guard<std::mutex> lock(mtx); // 锁住互斥锁
std::cout << "Reading data: " << sharedData << std::endl; // 读取共享数据
std::this_thread::sleep_for(std::chrono::milliseconds(50)); // 模拟读取过程中的延迟
}
}
int main() {
std::thread writer(writeData);
std::thread reader(readData);
writer.join();
reader.join();
return 0;
}
不加锁,还没写完就读取,容易出问题。输出如下
Reading data: start=> 0
Reading data: start=> 0
Write data: 0
Reading data: start=> 1
Write data: 1
Reading data: start=> 2
Write data: 2
Reading data: start=> 3
Write data: 3
Write data: 4
正确的写法如下
#include <iostream>
#include <mutex>
#include <string>
#include <thread>
std::mutex mtx; // 创建一个互斥锁
std::string sharedData; // 共享数据
void writeData() {
for (int i = 0; i < 5; ++i) {
{
std::lock_guard<std::mutex> lock(mtx); // 锁住互斥锁
// 写入共享数据
sharedData = "start=> ";
sharedData += std::to_string(i);
std::this_thread::sleep_for(std::chrono::milliseconds(50)); // 模拟写入过程中的延迟
sharedData += " <=end!\n";
std::cout << "Write data: " << i << std::endl;
}
std::this_thread::sleep_for(std::chrono::milliseconds(500)); // 模拟每次调用写的间隔
}
}
void readData() {
for (int i = 0; i < 5; ++i) {
{
std::lock_guard<std::mutex> lock(mtx); // 锁住互斥锁
std::cout << "Reading data: " << sharedData << std::endl; // 读取共享数据
}
std::this_thread::sleep_for(std::chrono::milliseconds(500)); // //模拟每次调用读的间隔
}
}
int main() {
std::thread writer(writeData);
std::thread reader(readData);
writer.join();
reader.join();
return 0;
}
输出
Reading data:
Write data: 0
Reading data: start=> 0 <=end!
Write data: 1
Reading data: start=> 1 <=end!
Write data: 2
Reading data: start=> 2 <=end!