std::mutex通过acquire-release语义建立happens-before关系,确保线程间内存可见性:当一个线程释放锁时,其对共享数据的修改会写回主内存;另一个线程获取同一互斥量时,能读取到最新值,防止重排序与缓存不一致问题。

C++中,
std::mutex
要理解
std::mutex
想象一下,你有一个共享变量
data
ready
data
ready
true
ready
true
data
mutex
data
ready
ready
true
data
data
ready
data
ready
std::mutex
立即学习“C++免费学习笔记(深入)”;
lock()
mutex::lock()
lock()
lock()
mutex
unlock()
mutex::unlock()
unlock()
unlock()
mutex
所以,当线程A在持有
mutex
data
ready
mutex
mutex
data
ready
#include <iostream>
#include <vector>
#include <thread>
#include <mutex>
#include <chrono> // For std::this_thread::sleep_for
std::vector<int> shared_data;
std::mutex mtx;
bool data_ready = false; // 共享标志
void producer_thread() {
// 模拟一些计算耗时
std::this_thread::sleep_for(std::chrono::milliseconds(100));
// 锁定互斥量,开始修改共享数据
mtx.lock();
try {
std::cout << "Producer: Adding data..." << std::endl;
for (int i = 0; i < 5; ++i) {
shared_data.push_back(i * 10);
}
data_ready = true; // 设置标志
std::cout << "Producer: Data added and ready flag set." << std::endl;
} catch (...) {
mtx.unlock(); // 确保异常安全解锁
throw;
}
mtx.unlock(); // 释放互斥量
}
void consumer_thread() {
// 等待数据准备好
// 注意:这里用一个简单的循环来演示,实际生产中会用条件变量
// 但为了突出mutex的可见性,这里先简化
while (true) {
mtx.lock(); // 尝试获取互斥量
if (data_ready) {
std::cout << "Consumer: Data is ready. Reading data..." << std::endl;
for (int val : shared_data) {
std::cout << val << " ";
}
std::cout << std::endl;
mtx.unlock(); // 释放互斥量
break; // 读取完毕,退出循环
}
mtx.unlock(); // 释放互斥量,以便生产者可以获取
std::this_thread::sleep_for(std::chrono::milliseconds(10)); // 避免忙等
}
}
int main() {
std::thread producer(producer_thread);
std::thread consumer(consumer_thread);
producer.join();
consumer.join();
std::cout << "Main: All threads finished." << std::endl;
return 0;
}在这个例子中,当
producer_thread
mtx.unlock()
shared_data
data_ready
consumer_thread
mtx.lock()
mutex
consumer_thread
data_ready
true
shared_data
有时候,人们会觉得,既然C++11引入了
std::atomic
mutex
std::atomic
std::atomic<bool>
std::atomic<int>
然而,当涉及到多个变量之间的数据一致性时,单独的原子操作就显得力不从心了。
std::atomic
举个例子,如果线程A需要修改
data_a
data_b
data_a
data_b
data_a
data_b
std::atomic
std::mutex
mutex
mutex
mutex
以上就是C++如何使用mutex保证内存可见性的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号