以下是一个示例,演示了如何使用 std::atomic 实现线程通信:
#include <iostream>
#include <thread>
#include <atomic>
std::atomic<int> sharedData(0); // 共享的原子变量
// 线程函数,对共享原子变量进行操作
void threadFunction(int id) {
for (int i = 0; i < 5; ++i) {
// 原子操作:自增
sharedData.fetch_add(1, std::memory_order_relaxed);
std::cout << "Thread " << id << " updated shared data: " << sharedData.load(std::memory_order_relaxed) << std::endl;
// 模拟一些工作
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
}
int main() {
// 创建两个线程
std::thread t1(threadFunction, 1);
std::thread t2(threadFunction, 2);
// 等待线程执行完成
t1.join();
t2.join();
return 0;
}
在这个示例中,我们定义了一个共享的原子变量 sharedData,它是一个 std::atomic<int> 类型的变量。在 threadFunction 函数中,每个线程会对 sharedData 进行自增操作,并输出当前的值。
在对 sharedData 进行操作时,我们使用了 std::atomic 提供的原子操作函数 fetch_add 和 load 来进行原子操作。fetch_add 函数用于原子地将指定值添加到变量中,load 函数用于原子地加载变量的当前值。
通过使用 std::atomic 来操作共享变量,我们可以在不需要显式加锁的情况下实现线程安全的操作。这样就避免了使用传统的互斥锁或条件变量,简化了线程通信的实现。