boost条件不在具有两个生产者和一个消费者的线程安全队列上工作

boost conditional not working on thread safe queue with two producers and one consumer

本文关键字:消费者 一个 线程 工作 队列 安全 两个 条件 生产者 boost      更新时间:2023-10-16

我有两个线程添加到"线程安全"队列中。但是,当第二个线程尝试"推送"内容时。不会通知消费者内容可用。队列继续增长,但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确实有效,但在Windows7中的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();
}

您的Makefile似乎没有使用-phread/-mthreads。一般来说,如果你不要求编译器生成多线程代码,就不要指望你的代码能正常工作。