当前位置:  开发笔记 > 编程语言 > 正文

std :: future.get()有时会卡在os x中

如何解决《std::future.get()有时会卡在osx中》经验,为你挑选了0个好方法。

我有两个线程,一个线程应该接收并处理另一个线程的请求.第二种是同步传输请求和接收响应.我尝试了以下方案:对的队列(值,承诺).第一个线程创建一个promise并将其推送到同步队列中并等待返回值future.get()

问题是有时线程卡住future.get(),但当我暂停程序执行并继续它再次正常工作.这种卡住具有随机性.

FutureQueue.h

#ifndef FutureQueue_h
#define FutureQueue_h

#include 
#include 
#include 
#include 
#include 

template 
class Work{
public:
    Work(){

    }
    Work(T value, std::promise* promise){
        m_value = value;
        m_p_promise = promise;
    }
    std::promise* m_p_promise;
    T m_value;
public:
    T getValue(){
        return m_value;
    }
    void setResult(R result){
        m_p_promise->set_value(result);
    }
};


template 
class FutureQueue
{
public:
    Work getWork(){
        auto p = pop();
        return Work(p.first,p.second);
    }
    R execute(T value)
    {
        std::promise promise = std::promise();
        std::future f = promise.get_future();
        auto p = std::pair*>(value, &promise);
        push(p);
        return f.get();
    }
    private:
    std::pair*> pop(){
        std::unique_lock mlock(mutex_);
        while (queue_.empty())
        {
            cond_.wait(mlock);
        }
        auto item = queue_.front();
        queue_.pop();
        return item;
    }
    void push(const std::pair*>& item){
        std::unique_lock mlock(mutex_);
        queue_.push(item);
        mlock.unlock();
        cond_.notify_one();
    }
    std::queue*>> queue_;
    std::mutex mutex_;
    std::condition_variable cond_;
};

#endif

main.cpp中

#include 
#include 

#include "FutureQueue.h"

using namespace std;

atomic quit;
FutureQueue mQueue;

void consumer(){
    Work work;
    while(true){
        work = mQueue.getWork();
        if (quit){
            break;
        }
        int value = work.getValue()+100;
        work.setResult(value);
    }
    work.setResult(0);
}

int main(int argc, const char * argv[]) {
    quit = false;
    thread thread(consumer);
    // test 2
    for (int i=0;i<100000;i++){
        int value = mQueue.execute(i);
        cout << "input " << i <<" execute result " <<  value << endl;
    }
    quit = true;
    mQueue.execute(-1);
    thread.join();
    return 0;
}

我不知道这段代码有什么问题,也许你可以建议更好的解决方案.谢谢

UPDATE

只有在带有Apple LLVM 6.0版的os x中才会出现粘滞现象

在Windows上的OS X和Linux以及Visual Studio上的gcc下没有问题

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有