我有两个线程添加到“线程安全”队列。但是当第二个线程试图“推送”内容时。不通知消费者内容可用。队列继续增长,但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();
}
答案 0 :(得分:0)
你的Makefile似乎没有使用-pthread / -mthreads。一般情况下,如果您不要求编译器生成多线程代码,请不要期望您的代码可以正常工作。