我有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
没有改变时,请指出已完成任何工作。
我使用t
或t_make
错了吗?我尝试在每个方法中发布lock_guard
但线程不会交织在一起。或者也许是t.join()
在错误的时间,但是我要提一下,如果我在使用t = std::thread(&Machine::t_make, this);
之后立即放置't.join'并且一切正常。
答案 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的?