解决了
我将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);


    }
即时消息放置一个提示来控制弹出的文件名,如果我推送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)));
     }
    }
 };

最佳答案

发布的代码看起来不错-如果您发现问题,也许还有其他地方应该使用该锁,而不应该使用该锁(例如,将一些内容添加到队列中的代码)。

关于c++ - boost scoped_lock。会锁吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1468000/

10-11 18:57