避免顺序线程中的冲突

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 &params)
    
        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

以上是关于避免顺序线程中的冲突的主要内容,如果未能解决你的问题,请参考以下文章

将数据从全局加载到共享内存时如何避免银行冲突

详解java中CAS机制所导致的问题以及解决——内存顺序冲突

多线程文件写同一个文件写不进去

如何避免死锁

如何避免死锁

17Java并发性和多线程-避免死锁