117.info
人生若只如初见

c++等待指令怎样实现同步

在C++中,有多种方法可以实现同步。以下是一些常用的同步机制:

  1. 互斥锁(Mutex):互斥锁是一种用于保护共享资源的同步原语。当一个线程获得互斥锁时,其他线程必须等待该线程释放锁才能访问共享资源。C++标准库中的std::mutexstd::lock_guard可以用于实现互斥锁。
#include 
#include 
#include 

std::mutex mtx; // 全局互斥锁

void print_block(int n, char c) {
    mtx.lock(); // 获取互斥锁
    for (int i = 0; i < n; ++i) {
        std::cout << c;
    }
    std::cout << std::endl;
    mtx.unlock(); // 释放互斥锁
}

int main() {
    std::thread th1(print_block, 50, '*');
    std::thread th2(print_block, 50, '$');

    th1.join();
    th2.join();

    return 0;
}
  1. 条件变量(Condition Variable):条件变量是一种用于线程间通信的同步原语。它允许一个线程等待某个条件成立,同时释放互斥锁,让其他线程继续执行。当条件成立时,等待的线程会被唤醒并重新获取互斥锁。C++标准库中的std::condition_variablestd::unique_lock可以用于实现条件变量。
#include 
#include 
#include 
#include 

std::mutex mtx; // 全局互斥锁
std::condition_variable cv; // 全局条件变量
int data = https://www.yisu.com/ask/0; // 全局数据"hljs">void worker(int n) {
    std::unique_lock lock(mtx); // 获取互斥锁
    cv.wait(lock, [] { return data >= n; }); // 等待条件成立
    for (int i = 0; i < n; ++i) {
        std::cout << data++ << ' ';
    }
    std::cout << std::endl;
    cv.notify_one(); // 唤醒等待的线程
}

int main() {
    std::thread th1(worker, 5);
    std::thread th2(worker, 10);

    th1.join();
    th2.join();

    return 0;
}
  1. 原子操作(Atomic Operations):原子操作是一种不可被中断的操作,用于实现无锁编程。C++11标准库中的std::atomic可以用于实现原子操作。
#include 
#include 
#include 

std::atomic counter(0); // 全局原子计数器

void increment(int n) {
    for (int i = 0; i < n; ++i) {
        counter.fetch_add(1); // 原子加1
    }
}

int main() {
    std::thread th1(increment, 1000);
    std::thread th2(increment, 1000);

    th1.join();
    th2.join();

    std::cout << "Counter: " << counter.load() << std::endl;

    return 0;
}

这些同步机制可以根据具体需求进行组合使用,以实现线程间的同步操作。

未经允许不得转载 » 本文链接:https://www.117.info/ask/fe85fAzsIBg5QBA.html

推荐文章

  • c# sqlhelper怎样提高代码复用性

    在C#中,为了提高SQLHelper代码的复用性,可以采取以下几种方法: 创建一个基类:创建一个包含通用数据库操作方法的基类,例如ExecuteNonQuery、ExecuteScalar、...

  • c# sqlhelper如何进行批量操作

    在C#中,使用SqlHelper类进行批量操作可以提高性能并减少数据库交互次数。以下是一个简单的示例,展示了如何使用SqlHelper类执行批量插入操作:
    首先,确保...

  • c# sqlhelper适用哪些开发场景

    C# SQLHelper 是一个用于简化数据库操作的类库,适用于以下开发场景: Web 应用程序:在ASP.NET Web应用程序中,可以使用SQLHelper来执行CRUD(创建、读取、更新...

  • c# sqlhelper怎样简化数据操作

    在C#中,使用SQLHelper类可以简化数据库操作。SQLHelper是一个用于执行SQL语句并返回结果集的辅助类。它通常包含以下功能: 连接数据库
    执行SQL查询
    执...

  • java weakreference的使用有哪些限制

    Java中的WeakReference是Java提供的一种特殊的引用类型,它允许开发者在不影响垃圾收集器正常工作的情况下,更灵活地管理对象的生命周期。WeakReference的主要作...

  • java weakreference在垃圾回收中的机制

    Java中的WeakReference是一种特殊的引用类型,它允许开发者在不影响垃圾回收器正常工作的情况下,更灵活地管理对象的生命周期。WeakReference在垃圾回收中的机制...

  • java weakreference如何实现自动清理

    Java中的WeakReference是一种特殊的引用类型,它允许垃圾回收器在内存不足时自动回收其所引用的对象。要实现自动清理,你可以使用WeakReference结合垃圾回收器来...

  • java weakreference在并发环境下的表现

    在Java中,WeakReference是一种特殊的引用类型,它允许垃圾回收器在内存不足时回收其所引用的对象。WeakReference的主要作用是帮助实现内存敏感的高速缓存。在并...