解决了
我将 bfs::directory_iterator 队列更改为 std::string 队列,出人意料地解决了这个问题。
嗨,我有一种直觉,我做错了事。
我已经实现(或试图)线程池模式。
N 个线程从队列中读取,但我遇到了一些麻烦。这是我得到的:
//inside a while loop
bool isEmpty;
bfs::directory_iterator elem;
{
boost::mutex::scoped_lock lock(this->queue_mutex);
isEmpty = this->input_queue.isEmpty();
if (!isEmpty){
elem= *(this->input_queue.pop());
}
else{
continue;
}
}
scoped_lock 是否仍然可以在 if 的主体内工作?我开始相信它不会(在运行了许多测试之后)。如果没有,是否有任何范围的方法来做到这一点(即不是显式锁定解锁方式)
提前致谢。
更新
将元素添加到队列的代码如下所示
//launches the above code, passing a reference to mutex and queue.
Threads threads(queue,queue_mutex);
for (bfs::directory_iterator dir_it:every file in directory){
boost::mutex::scoped_lock lock(queue_mutex);
queue.push(dir_it);
}
我放置了一个 cout 来控制弹出的文件名,如果我推送 2 个文件(file1)和(file2),并使用 2 个线程,我会得到两个“file2”。
class Threads{
boost::thread::thread_group group;
Thread (N){
//also asigns a reference to a queue and a mutex.
for(i 1..N){
//loop is posted above.
group.add(new boost::thread(boost::bind(&loop,this)));
}
}
};