避免顺序线程中的冲突
Posted
技术标签:
【中文标题】避免顺序线程中的冲突【英文标题】:Avoid confilicts in sequential threads 【发布时间】:2016-08-05 07:21:12 【问题描述】:我需要创建一个如下方式的循环:
while (!end)
// some modifications to myPar
boost::thread t(&myClass::myFun, this, myPar);
// other operations
在每次迭代中,我希望线程仅在上一次迭代中调用的线程完成时才启动。但我不希望“其他操作”等待它。 有没有办法做到这一点?
【问题讨论】:
【参考方案1】:我没有玩过 boost::thread,但类似的东西应该可以工作
boost::thread t;
while (!end)
// some modifications to myPar
if(t.joinable())
t.join();
t = &myClass::myFun, this, myPar;
// other operations
编辑 关于 cmets 你可以做这样的事情
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。从队列中推送和弹出也必须是线程安全的。
【讨论】:
这不会延迟“其他操作”的执行吗? 还有哪些其他操作? @charles,您需要并行运行您无需等待即可执行的操作 如果您想并行运行 myFun 但一次只运行一个,请创建类似带有参数队列的类,这将在其他线程中使用队列中的参数顺序运行 myClass::fun以上是关于避免顺序线程中的冲突的主要内容,如果未能解决你的问题,请参考以下文章