我想知道是否有人对当任务> 0 时通知 processJob() 函数的作业队列有任何好的设计建议。我正在使用 Boost 和 C++,只是想大致了解这种设计。谢谢。
问问题
118 次
2 回答
0
我会processJob()
在一个单独的线程中运行,它使用“条件变量”来判断它是否正在运行;并在向队列中添加某些内容时,通知该 cv
循环逻辑类似于:
boost::unique_lock<boost::mutex> lock(mymutex);
while (!terminate)
{
lock.lock();
while (!Q.empty())
jobCV.wait(lock);
pItem = Q.pop();
lock.unlock();
pItem->process();
}
请记住,将项目添加到队列也需要锁定同一个互斥体。此外,在此之前您需要wait()
对将设置的信号进行测试terminate
;并且该信号的设置也需要调用notify()
cv
于 2013-01-15T17:45:58.720 回答
0
如果你已经使用了 boost 库,那么只使用 boost::asio 会很方便。io_service 对象可用于管理作业队列,因为它保证将按照发布的顺序调用回调。如果您只在一个线程中运行 io_service,则不会有锁的麻烦。一些示例代码:
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/thread.hpp>
#include <boost/shared_ptr.hpp>
#include <iostream>
#include <cstdlib>
int job_number = 0;
struct Job
{
virtual void run() { std::cout << "job " << ++job_number << " done" << '\n'; }
virtual ~Job() {}
};
class Processor
{
private:
boost::asio::io_service ioserv_;
boost::asio::io_service::work work_;
boost::thread thread_;
public:
Processor() : ioserv_(), work_(ioserv_) {
}
void run() {
ioserv_.reset();
thread_ = boost::thread (boost::bind(&boost::asio::io_service::run, &ioserv_));
}
void stop() {
ioserv_.stop();
}
~Processor() {
stop();
if (thread_.get_id() != boost::thread::id())
thread_.join();
}
void processJob(boost::shared_ptr<Job> j)
{
j->run();
}
void addJob(boost::shared_ptr<Job> j)
{
ioserv_.post(boost::bind(&Processor::processJob, this, j));
}
};
int main()
{
Processor psr;
psr.run();
for (int i=0; i<10; ++i)
psr.addJob(boost::shared_ptr<Job>(new Job));
sleep(1);
return 0;
}
于 2013-01-16T01:57:17.717 回答