我需要按以下方式创建一个循环:
while (!end) {
// some modifications to myPar
boost::thread t(&myClass::myFun, this, myPar);
// other operations
}
在每次迭代中,我希望线程仅在上一次迭代中调用的线程完成时启动。但我不想要"其他操作"等待它。 有没有办法做到这一点?
答案 0 :(得分:0)
我没有使用boost :: thread,但类似的东西应该可以使用
boost::thread t;
while (!end) {
// some modifications to myPar
if(t.joinable())
t.join();
t = {&myClass::myFun, this, myPar};
// other operations
}
EDIT 关于评论你可以做这样的事情
class Worker
{
public:
void addParams( const SomeParams ¶ms)
{
paramsQueue.push(params);
}
void start()
{
auto loop = [this]()
{
while(!interrupted)
{
//BLOCK HERE if queue is empty
auto params = paramsQueue.pop();
//do something with params
}
};
thread = {loop};
}
void interrupt()
{
interrupted = true;
}
private:
boost::thread thead;
std::queue<SomeParams> paramsQueue;
bool interrupted = false;
};
...
Worker worker;
worker.start();
while (!end) {
// some modifications to myPar
worker.addParams(params);
// other operations
}
但请记住实施阻止,因为如果您尝试读取空队列,您将拥有UB。从队列中推送和弹出也必须是线程安全的。