在 C++ 中的两个线程之间同步变量的正确方法是啥?

Posted

技术标签:

【中文标题】在 C++ 中的两个线程之间同步变量的正确方法是啥?【英文标题】:What is the correct way to sync variables between two threads in C++?在 C++ 中的两个线程之间同步变量的正确方法是什么? 【发布时间】:2021-12-24 08:22:42 【问题描述】:

我有以下两个函数在两个不同的线程上运行。

#include <mutex>

std::mutex mu;
int productinStock = 100;
int productinStore = 20;

//Running on main thread: Function called when Purchase happen
void UpdateStoreStock()

    UpdateNumProduct();
    UpdateSalesPerMonth();
    std::lock_guard<std::mutex> guard(mu);
    
       if(productinStore == 0 && 0 < productinStock)
          OrderProduct();
    



//Running on second thread: Function to Recv product from other stores
void RecvProduct(int num)

   std::lock_guard<std::mutex> guard(mu);
   
       productinStore = num;
       productinStock = productinStock - num;
      
   

商店的数量由用户运行的排名数决定,每个排名被视为一个商店。 大多数情况下,当我运行程序时,它会成功运行。但有时两个不同线程上的变量productinStockproductinStore 的值并不相同。 我是否遗漏了一些会导致两个线程不同步的内容?

【问题讨论】:

由于您没有显示UpdateNumProductUpdateSalesPerMonth,我们应该如何猜测它们中的任何一个是否在不持有锁的情况下改变了这些变量?或者没有显示任何其他代码,因为这显然不是一个完整的示例? 【参考方案1】:

试试这个,看看是否有帮助:

void UpdateStoreStock()

    std::lock_guard<std::mutex> guard(mu);
    UpdateNumProduct();
    UpdateSalesPerMonth();
    if(productinStore == 0 && 0 < productinStock) 
       OrderProduct();
    


//Running on second thread: Function to Recv product from other stores
void RecvProduct(int num)

   std::lock_guard<std::mutex> guard(mu);
   productinStore = num;
   productinStock = productinStock - num;

具体来说,在你的整个方法中使用你的锁保护。此外,您插入的额外大括号不会做任何事情 - 除非您将后卫移动到大括号内,否则它会控制范围。

【讨论】:

以上是关于在 C++ 中的两个线程之间同步变量的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Linux线程同步必知,常用方法揭秘!

volatile 学习笔记

c++ 面向对象的静态函数 多线程调用

线程同步

检查联合实例之间是不是相等的正确方法是啥?

Linux下的互斥锁和条件变量