0

我用互斥锁包装了一个 boost 侵入式列表,以使其线程安全,用作生产者/消费者队列。

但是在windows(MSVC 14)上它真的很慢,在分析之后,95%的时间都花在空闲上,主要是push()waint_and_pop()方法。

我只有 1 个生产者和 2 个生产者/消费者线程。

有什么建议可以加快速度吗?

#ifndef INTRUSIVE_CONCURRENT_QUEUE_HPP
#define INTRUSIVE_CONCURRENT_QUEUE_HPP
#include <thread>
#include <mutex>
#include <condition_variable>
#include <boost/intrusive/list.hpp>

using namespace boost::intrusive;

template<typename Data>
class intrusive_concurrent_queue
{
protected:
    list<Data, constant_time_size<false> > the_queue;
    mutable std::mutex the_mutex;
    std::condition_variable the_condition_variable;

public:
    void push(Data * data)
    {
        std::unique_lock<std::mutex> lock(the_mutex);
        the_queue.push_back(*data);
        lock.unlock();
        the_condition_variable.notify_one();
    }

    bool empty() const
    {
        std::unique_lock<std::mutex> lock(the_mutex);
        return the_queue.empty();
    }

    size_t unsafe_size() const
    {
        return the_queue.size();
    }

    size_t size() const
    {
        std::unique_lock<std::mutex> lock(the_mutex);
        return the_queue.size();
    }

    Data* try_pop()
    {
        Data* popped_ptr;
        std::unique_lock<std::mutex> lock(the_mutex);
        if(the_queue.empty())
        {
            return nullptr;
        }

        popped_ptr= & the_queue.front();
        the_queue.pop_front();
        return popped_ptr;
    }

    Data* wait_and_pop(const bool & exernal_stop = false)
    {
        Data* popped_ptr;
        std::unique_lock<std::mutex> lock(the_mutex);

        the_condition_variable.wait(lock,[&]{ return ! ( the_queue.empty() | exernal_stop ) ; });

        if ( exernal_stop){
            return nullptr;
        }

        popped_ptr=&the_queue.front();
        the_queue.pop_front();
        return popped_ptr;
    }

    intrusive_concurrent_queue<Data> & operator=(intrusive_concurrent_queue<Data>&& origin)     
        {
        this->the_queue = std::move(the_queue);
        return *this;
        }

};

#endif // !INTRUSIVE_CONCURRENT_QUEUE_HPP
4

1 回答 1

1

尝试从方法中移除锁并在使用它时锁定整个数据结构。

于 2016-05-06T18:42:55.417 回答