I have two threads that are added to the stream queue. However, when the second thread tries to โclickโ the content. The consumer is not notified of the availability of content. The queue continues to grow, but notify_one () never notifies the conditional expression in the consumption method. Why is this?
#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
This code works in Fedora 14 using boost 1.51.0, however it does not work in boost 1.50.0 on Windows 7.
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(); }
source share