在两个生产者和一个消费者的线程安全队列中提升条件不起作用

时间:2013-02-12 21:48:08

标签: c++ boost concurrency queue

我有两个线程添加到“线程安全”队列。但是当第二个线程试图“推送”内容时。不通知消费者内容可用。队列继续增长,但notify_one()从不在使用方法中通知条件。这是为什么?

#ifndef CONCURRENT_QUEUE_H
#define CONCURRENT_QUEUE_H

#include <queue>
#include <boost/thread.hpp>

template<typename Data>
class concurrent_queue {
private:
    std::queue<Data> the_queue;
    mutable boost::mutex the_mutex;
    boost::condition_variable the_condition_variable;
public:
    void push(Data const& data) {
        boost::mutex::scoped_lock lock(the_mutex);
        the_queue.push(data);
        lock.unlock();
        the_condition_variable.notify_one();
    }

    void wait_and_pop(Data& popped_value) {
        boost::mutex::scoped_lock lock(the_mutex);
        while(the_queue.empty()) {
            the_condition_variable.wait(lock);
        }

        popped_value=the_queue.front();
        the_queue.pop();
    }
};
#endif

此代码在Fedora 14中使用boost 1.51.0可以正常工作,但在Windows 7的boost 1.50.0中不起作用。

INCLUDEPATH += \
    . \
    /home/mehoggan/Devel/x86-fps/boost_1_50_0/include

LDFLAGS += -Wl,-rpath=/home/mehoggan/Devel/x86-fps/boost_1_50_0/lib

LIBS += \
    -L/home/mehoggan/Devel/x86-fps/boost_1_50_0/lib \
    -lboost_system \
    -lboost_thread \
    -lz

#ifndef CONCURRENT_QUEUE_H
#define CONCURRENT_QUEUE_H

#include <queue>
#include <boost/thread.hpp> // Using boost 1.50.0

template<typename Data>
class concurrent_queue {
private:
    std::queue<Data> the_queue;
    mutable boost::mutex the_mutex;
    boost::condition_variable the_condition_variable;
public:
    void push(Data const& data) {
        boost::mutex::scoped_lock lock(the_mutex);
        the_queue.push(data);
        lock.unlock();
        the_condition_variable.notify_all();
    }

    void wait_and_pop(Data& popped_value) {
        boost::mutex::scoped_lock lock(the_mutex);
        while(the_queue.empty()) {
            the_condition_variable.wait(lock);
        }

        popped_value=the_queue.front();
        the_queue.pop();
    }
};
#endif

concurrent_queue<int> the_queue;

void thread1func() {
    do {
        the_queue.push(1);
    } while (true);
}

void thread2func() {
    do {
        the_queue.push(2);
    } while (true);
}

void thread3func() {
    do {
        int read;
        the_queue.wait_and_pop(read);

        std::cout << "I read from thread " << read << std::endl;
    } while (true);
}

int main(int argc, char *argv[]) {
    boost::thread thread1 = boost::thread(thread1func);
    boost::thread thread2 = boost::thread(thread2func);
    boost::thread thread3 = boost::thread(thread3func);

    thread1.join();
    thread2.join();
    thread3.join();
}

1 个答案:

答案 0 :(得分:0)

你的Makefile似乎没有使用-pthread / -mthreads。一般情况下,如果您不要求编译器生成多线程代码,请不要期望您的代码可以正常工作。