线程无法正常工作

时间:2014-11-18 20:09:02

标签: c++ multithreading mutex

我有class Machine个成员函数。在makeProduct我创建了一个调用t_make然后调用return的线程。虽然线程正在成员函数中工作,但我仍然想使用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'并且一切正常。

2 个答案:

答案 0 :(得分:1)

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

您对析构函数的加入对此练习并没有多大意义。如果你想确保收集结果并使用它做一些事情,因为机器超出范围它可能有意义,但它对你检查状态的问题没有意义。如果你希望Status()仅在t_make()完成后返回值,那么将join()代码移动到Status将起作用。

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

答案 1 :(得分:1)

如果t_make正在修改'stat',那么你的Status函数应该在使用copStat赋值中的'stat'之前获取锁。内存访问目前不安全。

正如代码所说的那样,如果您希望在调用Status之前完成t_make调用,则没有任何强制要求这样做。按原样,两个独立的线程将自动完成这些操作 - 一个线程调用t_make和一个线程调用Status。无法保证这种情况发生的顺序。(如果您向状态添加锁定,则会更改

另外,您是否可以更新您的示例以说明您是如何确定从未填充过copStat的?