std::atomic 实现线程通信

62 阅读1分钟

以下是一个示例,演示了如何使用 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_addload 来进行原子操作。fetch_add 函数用于原子地将指定值添加到变量中,load 函数用于原子地加载变量的当前值。

通过使用 std::atomic 来操作共享变量,我们可以在不需要显式加锁的情况下实现线程安全的操作。这样就避免了使用传统的互斥锁或条件变量,简化了线程通信的实现。