线程工作不正常
Thread is not working properly
我有一个带有一些成员函数的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
没有改变时,表明任何工作都已完成。
我使用t
或t_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 从未填充?
- 不确定要在我的main中放入什么才能使我的代码正常工作
- C++中的memset函数工作不正常
- 为什么 HeapFree() 不能正常工作?
- 如果不在窗口 10 中声明名为 openCV 的 openCV namedWindow,QT 图像显示将无法正常工作
- 通用线程池类工作不正常
- 循环仅对第一行正常工作.其他行不受 for 的影响
- 为什么在C++中使用关系运算符创建的模板函数不能对字符串正常工作?
- C++自定义删除运算符不能正常工作?
- 为什么使用 exec() 重新启动程序不能正常工作?
- C++:返回本地对象,但不能正常工作
- 名为DLL的C++windows服务程序工作不正常
- C++-循环中的If语句工作不正常
- 为什么带lcov的codecov在Travis上不能正常工作,而在我当地的Linux Mint上却不能正常工作
- While循环和if/else语句工作不正常
- 为什么sizeof函数在这里不能正常工作
- 异步操作的 Asio 处理程序在其同步对应项正常工作时不会调用
- C++:最大数组值函数工作不正常
- 图像上的按钮不正常工作在QT
- 透明SDL2游戏(WIN32色键不正常工作)
- Qt 5.3 QSystemTrayIcon不正常工作[Linux]