C++线程互斥以及同步

论坛 期权论坛 期权     
CPP朱小勇   2019-7-13 07:43   3279   0
一、线程互斥如果多个线程需要访问且可能修改同一个变量,那么需要加锁,保证同一时刻只有一个线程可以访问,这个动作即最小“原子操作”方式1:使用c++提供的类mutex,lock,unlock即可保证线程同步
  1. #include
复制代码
  1. mutex mx;
复制代码
  1. int haha()
复制代码
  1. {
复制代码
  1.    mx.lock();
复制代码
  1.    do()
复制代码
  1.   {
复制代码
  1.        //
复制代码
  1.    }
复制代码
  1.    mx.unlock();
复制代码
  1.    return 0;
复制代码
  1. }
复制代码
缺点:如果do函数异常,这里会造成死锁
方式2:使用lock_guard代替mutex
为了解决上述问题,使用lock_guard,这个模板类在构造函数里lock mutex,在析构函数里unlock mutex,所以不用自己在unlock
  1. #include
复制代码
  1. mutex mx;
复制代码
  1. int haha()
复制代码
  1. {
复制代码
  1.    {//使用作用域,只需要锁住改变公共变量的代码
复制代码
  1.       std::lock_guard lck(m_mutex);
复制代码
  1.       do()
复制代码
  1.      {
复制代码
  1.            //
复制代码
  1.       }
复制代码
  1.    }
复制代码
  1.    return 0;
复制代码
  1. }
复制代码
  1. [/code]
  2. [b]二、线程同步[/b]
  3. 线程同步是指不同线程按指定顺序做某事情,某一线程是否做某动作,是由另一个线程来管理的,如线程池按顺序调度队列,消费者会等待生产者生产了任务后再进行工作。如果不同步,我们一般会使用死循环来访问。这里举例生产-消费模型
  4. 生产者每隔某时间会生产出一个任务,消费者选择最优方式去调度任务
  5. 方式1:
  6. 不同步,使用死循环
  7. [list][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][/list][code]std::deque q;
复制代码
  1. std::mutex mu;
复制代码
  1. [/code][code]void function_1()
复制代码
  1. {
复制代码
  1.     int count = 10;
复制代码
  1.     while (count > 0)
复制代码
  1.     {
复制代码
  1.         std::unique_lock locker(mu);
复制代码
  1.         q.push_front(count);
复制代码
  1.         locker.unlock();
复制代码
  1.         std::this_thread::sleep_for(std::chrono::seconds(1));
复制代码
  1.         count--;
复制代码
  1.     }
复制代码
  1. }
复制代码
  1. [/code][code]void function_2()
复制代码
  1. {
复制代码
  1.     int data = 0;
复制代码
  1.     while (data != 1)
复制代码
  1.     {
复制代码
  1.         std::unique_lock locker(mu);
复制代码
  1.         if (!q.empty())
复制代码
  1.         {
复制代码
  1.             data = q.back();
复制代码
  1.             q.pop_back();
复制代码
  1.             locker.unlock();
复制代码
[code]            std::cout
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:
帖子:
精华:
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP