线程工作不正常

Thread is not working properly

本文关键字:不正常 工作 线程      更新时间:2023-10-16

我有一个带有一些成员函数的class Machine。在makeProduct中,我创建了一个调用t_make然后调用return s的线程。当线程在成员函数中工作时,我仍然想使用Machine(状态检查、剩余资源等)

我开始是这样的

//machine.h 
private
  int stat; 
  std::thread t;
  std::mutex m;
  bool working;
//machine.cpp
    int Machine::makeProduct(){
      if(working == true) return -1;
      t = std::thread(&Machine::t_make, this);
      return 0;
    }
    void Machine::t_make(){
        std::lock_guard<std::mutex> guard(m);
        //do some time-consuming work, change "stat" in progress
    }
    void Machine::Status(int &copStat){
        copStat = stat;
    }
    Machine::~Machine(){  if(t.joinable()) t.join; }
//main.cpp 
...
Machine m;
m.makeProduct();
int getStat = 0;
m.Status(getStat);
if(getStat == 1) cout<< "Product in making";

问题是,当我打电话给makeProduct()并在那之后Status() copStat没有改变时,表明任何工作都已完成。

我使用tt_make是错误的吗?我尝试在每种方法中发布lock_guard,但线程没有交织在一起。或者也许t.join()在错误的时间,但让我提一下,如果我在使用t = std::thread(&Machine::t_make, this);后立即放置"t.join"并且一切正常。

当你在调用getProduct()后立即调用Status()时,很有可能新线程还没有开始做任何事情。 您仍在原始线程中,新线程必须设置并开始运行。

加入析构函数对于本练习没有实际意义。 如果您想确保收集结果并在机器超出范围时对其进行处理,这可能是有意义的,但这对您关于检查状态的问题没有意义。 如果您希望 Status() 仅在 t_make() 完成后返回值,那么将 join() 代码移动到 Status 就可以了。

查看立式线程库 http://en.cppreference.com/w/cpp/thread#Futures 中的期货。 这些是用于执行异步任务并在任务完成时获取结果的实用程序。

如果t_make正在修改"stat",那么您的状态函数应该在分配 copStat 时使用 'stat' 之前获取锁。内存访问当前不安全。

就目前的代码而言,如果您希望在调用 Status 之前完成t_make调用,则没有什么可以强制这种情况发生。按原样,两个单独的线程将自主完成这些操作 - 1 个线程调用 t_make 和 1 个线程调用 Status。无法保证这种情况的发生顺序。(如果将锁定添加到状态,则会更改)

另外,您能否更新您的示例以显示您如何确定 copStat 从未填充?