Boost Conditionally Doesn't Work on Stream Security with Two Manufacturers and One Consumer

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(); } 
+4
source share
1 answer

Your Makefile does not seem to use -pthread / -mthreads. In general, don't expect your code to work at all unless you ask the compiler to generate multi-threaded code.

0
source

All Articles