c++中的向量和线程

vectors and threading in C++

本文关键字:线程 向量 c++      更新时间:2023-10-16

我想请求关于如何解决矢量和线程问题的评论/想法,这变得有点复杂。我研究了这个问题,还没有找到一个可行的解决方案。

的目的是有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));

有什么办法可以解决这个问题吗?

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

…件事:

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

实际上说的……

  • 给我Person类,
  • 然后vector在一个未指定的Person实例中,它不包含任何这样的vector
  • 然后在无效的vector中添加索引i
  • 然后以某种方式获得该实例的构造函数
  • 然后以某种方式从该构造函数中获取方法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)();
    }
};

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