legongju.com
我们一直在努力
2025-02-04 11:42 | 星期二

C++互斥锁能替代条件变量吗

C++的互斥锁(mutex)和条件变量(condition variable)是两种不同的同步原语,它们各自有不同的用途。互斥锁主要用于保护共享资源,确保在同一时间只有一个线程可以访问该资源。而条件变量则用于线程间的通信,允许一个线程等待某个条件成立,同时释放互斥锁,让其他线程有机会执行并改变条件。

虽然互斥锁和条件变量在某些情况下可以结合使用,但它们并不能相互替代。下面是一个简单的例子来说明它们的区别和用途:

#include 
#include 
#include 
#include 

std::mutex mtx;
std::condition_variable cv;
bool ready = false;

void print_id(int id) {
    std::unique_lock lck(mtx);
    while (!ready) { // 如果条件不满足,则等待
        cv.wait(lck); // 释放锁,等待条件变量通知
    }
    std::cout << "thread " << id << '\n';
}

void go() {
    std::this_thread::sleep_for(std::chrono::seconds(1)); // 模拟耗时操作
    std::unique_lock lck(mtx);
    ready = true; // 改变条件
    cv.notify_all(); // 通知所有等待的线程
}

int main() {
    std::thread threads[10];
    // spawn 10 threads:
    for (int i = 0; i < 10; ++i)
        threads[i] = std::thread(print_id, i);

    std::cout << "10 threads ready to race...\n";
    go(); // go!

    for (auto &th : threads) th.join();

    return 0;
}

在这个例子中,我们创建了10个线程,它们都在等待一个条件(ready变量)成立。当go函数被调用时,它改变了ready变量的值,并通过条件变量通知所有等待的线程。每个线程在收到通知后,都会继续执行并打印其ID。

从这个例子可以看出,互斥锁和条件变量在同步和通信方面各有其独特的作用。互斥锁用于保护共享资源,而条件变量用于线程间的通信。因此,它们不能相互替代,而应该根据具体需求一起使用。

未经允许不得转载 » 本文链接:https://www.legongju.com/article/14181.html

相关推荐

  • c++ mysql库的数据更新与删除操作

    c++ mysql库的数据更新与删除操作

    在C++中,可以使用MySQL C++ Connector库来进行数据更新和删除操作。以下是一个简单的示例代码,展示如何使用MySQL C++ Connector库来进行数据更新和删除操作:<...

  • c++ memset_s与memset有何不同

    c++ memset_s与memset有何不同

    memset_s 和 memset 都是 C++ 中用于设置内存区域的函数,但它们之间存在一些关键差异 安全性:memset_s 是一个更安全的版本,因为它会检查目标缓冲区的大小。如...

  • c++中使用memset_s需要注意什么

    c++中使用memset_s需要注意什么

    在C++中,memset_s函数是一个安全的内存设置函数,它可以防止缓冲区溢出 包含头文件:在使用memset_s之前,请确保已经包含了正确的头文件。对于C++,应该包含头文...

  • c++ memset_s如何安全清零内存

    c++ memset_s如何安全清零内存

    在C++中,memset_s是一个安全的方法来清零内存
    #include
    #include int main() { char buffer[100]; // 填充缓冲区 for (int i = 0; i< sizeof(buffer)...

  • C++互斥锁有哪些使用场景

    C++互斥锁有哪些使用场景

    C++互斥锁(mutex)是一种同步原语,用于在多线程环境中保护共享资源,防止多个线程同时访问导致的数据竞争和不一致问题。以下是C++互斥锁的一些常见使用场景: ...

  • C++互斥锁如何实现线程同步

    C++互斥锁如何实现线程同步

    在C++中,互斥锁(mutex)是一种同步原语,用于确保多个线程在访问共享资源时不会发生冲突。C++标准库中的头文件提供了互斥锁的实现。以下是一个简单的示例,展示...

  • C++并发编程有哪些实践案例

    C++并发编程有哪些实践案例

    C++并发编程的实践案例有很多,以下是一些常见的例子: 多线程计数器:这是一个简单的多线程计数器示例,使用C++11的std::thread和std::atomic实现。 #include #...

  • C++并发编程能提升性能吗

    C++并发编程能提升性能吗

    是的,C++并发编程可以提升程序的性能。通过将程序分解为多个可以并行执行的任务,可以充分利用多核处理器的计算能力,从而提高程序的执行速度。
    C++提供了...