C ++中的向量和线程

时间:2016-08-18 16:06:57

标签: c++ multithreading vector

我想就如何解决变得有点复杂的矢量和线程问题征求意见/想法。我已经研究过这个问题,但还没有找到可行的解决方案。

目的是拥有5个人对象(存储在向量中),然后调用他们的每个方法同时读取一本书(因此是线程)。 read函数包含一个永无止境的循环。

我有以下代码(简化)设置:

class Book{
    private:
         // some data                                                                                   
    public:
        // some functions                                                                              
};

class Person{
    private:
        // some data vars                                                                              
        int id;
        Book abook;
    public:
        // some functions                                                                              
        Person(int index=0);  // constructor                                                           
        void readBook();
};

int main(void){

    vector<Person>PersonsVector;
    vector<thread> threads;
    int num_of_persons = 5;

    for(int i=0; i<num_of_persons; i++){
        PersonsVector.push(Person(i));  //create different people       
        threads.push_back(thread(PersonsVector[i].readBook)); //read book in thread        
    }

   // wait for threads to finnish or kill threads                                                 
    for(auto& thread: threads) 
        threads.join();
}

我的问题是如何调用readBook()函数并将其推送到线程

 threads.push_back(thread(PersonsVector[i].readBook)); //read book in thread

以下各种变体导致错误......

 threads.push_back(thread(&PersonsVector[i].Person::readBook, this));             
 threads.push_back(thread(&Person::PersonsVector[i].Person::readBook, this));

我有什么想法可以解决这个问题?

2 个答案:

答案 0 :(得分:2)

必须使用指定类和方法的指针+要调用所述方法的所述类的实例的组合来调用指向方法的指针。

这......事:

&Person::PersonsVector[i].Person::readBook

实际上说......

  • 让我上课Person
  • 然后在vector的未指定实例中Person,其中不包含任何此类vector ...
  • 然后在该无效i
  • 中的索引vector
  • 然后以某种方式获取该实例的构造函数,
  • 然后以某种方式从该构造函数中获取方法readBook()

看到问题?这是多种不同方式的无效语法。

正确的语法如下:

  • 对于指向方法的指针:&Person::readBook
  • 对于实例:PersonsVector[i]

...并且您需要通过某种机制将这些内容提供给std::thread,这些机制将指针指向方法和实例捆绑在一起并使它们可以调用 - 例如lambda,std::bind,等等 - 像这样:

std::thread theThread{
    [] // not sure which capture is needed... :/
    {
        (someInstance.*pointerToMethod)(the, args);
        // i.e.
        (PersonsVector[i].*readBook)();
    }
};

答案 1 :(得分:0)

你可以使用lambda: threads.push_back(thread([&PersonsVector[i]])(Person& p){ p.readBook(); });