首页  >  文章  >  后端开发  >  C++ 并发编程中的同步原语详解

C++ 并发编程中的同步原语详解

WBOY
WBOY原创
2024-05-31 22:01:04804浏览

在 C 多线程编程中,同步原语的作用是保证多个线程访问共享资源时的正确性,它包括:互斥锁(Mutex):保护共享资源,防止同时访问;条件变量(Condition Variable):线程等待特定条件满足才继续执行;原子操作:保证操作以不可中断的方式执行。

C++ 并发编程中的同步原语详解

C 并发编程中的同步原语详解

在多线程编程中,同步原语是至关重要的,它可以保证多个线程访问共享资源时的正确性。C 提供了丰富的同步原语,包括互斥锁、条件变量和原子操作。

互斥锁 (Mutex)

互斥锁是一个用于保护共享资源的同步机制。当一个线程获得互斥锁后,其他线程将被阻塞,直到互斥锁被释放。在 C 中,可以使用 std::mutex 类来实现互斥锁:

std::mutex mtx;
// ...
{
    // 获取互斥锁
    std::lock_guard<std::mutex> lock(mtx);
    // 临界区
} // 互斥锁在离开作用域时自动释放

条件变量 (Condition Variable)

条件变量允许线程等待某个特定条件满足才继续执行。在 C 中,可以使用 std::condition_variable 类来实现条件变量:

std::condition_variable cv;
// ...
{
    std::unique_lock<std::mutex> lock(mtx);
    // 等待条件满足
    cv.wait(lock);
    // 执行条件满足后要执行的代码
}

原子操作

原子操作保证一个操作以不可中断的方式执行。在 C 中,可以使用 atomic 库来进行原子操作:

std::atomic<int> counter;
// ...
counter++; // 原子地增加 counter 的值

实战案例

考虑一个有共享计数器和写入线程的程序。写入线程需要原子地增加计数器,而读取线程需要保护地读取计数器:

std::atomic<int> counter;
std::mutex mtx;

// 写入线程
void write_thread() {
    while (true) {
        // 原子地增加计数器
        counter++;
    }
}

// 读取线程
void read_thread() {
    while (true) {
        // 保护地读取计数器
        std::lock_guard<std::mutex> lock(mtx);
        std::cout << "Counter: " << counter << std::endl;
    }
}

int main() {
    std::thread t1(write_thread);
    std::thread t2(read_thread);
    t1.join();
    t2.join();
    return 0;
}

以上是C++ 并发编程中的同步原语详解的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn