C ++中的向量和线程

qboomerang

我想征询有关如何解决向量和线程问题的意见/想法,这些问题正变得有些令人费解。我已经研究了这个问题,但没有找到可行的解决方案。

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

我设置了以下代码(简体):

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));

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

underscore_d

指向方法的指针必须使用指定类和方法的指针的组合以及要在其上调用所述方法的所述类的实例来调用。

这东西:

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

其实说...

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

看到问题了吗?这在许多方面都是无效的语法。

正确的语法如下:

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

...并且您需要std::thread通过某种机制将这些方法绑定到方法和实例的指针,并使其对您可调用(例如lambdastd::bind等),如下所示:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有线程向量和队列的管道C ++

来自分类Dev

C ++在循环中创建线程并将其存储在向量中

来自分类Dev

向量容器和C ++中的静态绑定?

来自分类Dev

C#中的线程和异步操作

来自分类Dev

在C#中打开和关闭线程

来自分类Dev

chdir()和C中的多线程

来自分类Dev

在C#中打开和关闭线程

来自分类Dev

C和线程中的函数超时

来自分类Dev

C#中主线程和其他线程的基准

来自分类Dev

C ++数组和向量

来自分类Dev

在C ++中迭代向量的向量

来自分类Dev

在C ++中迭代向量的向量

来自分类Dev

C ++中的Clang向量扩展和相等运算符

来自分类Dev

向量在C ++和push_back()中的使用

来自分类Dev

向量到字符串和C ++中的HashMap

来自分类Dev

C ++ 98中基于范围的循环和向量

来自分类Dev

C ++中的向量持久性和瞬态

来自分类Dev

点在C#中的矩阵和列向量之间相乘

来自分类Dev

向量到字符串和C ++中的HashMap

来自分类Dev

向量到数组和C ++中的数组大小

来自分类Dev

c ++在arduino中传递HIGH和LOW的向量

来自分类Dev

如何访问和改变存储在向量 C++ 中的对象

来自分类Dev

在向量C ++的向量中删除向量

来自分类Dev

C ++,线程和指针

来自分类Dev

C ++,信号和线程

来自分类Dev

C ++ 98和线程

来自分类Dev

C ++对象和线程

来自分类Dev

如何在C ++和OpenCV的向量向量中存储来自不同图像的多个描述符?

来自分类Dev

c ++ 11向量作为类成员的线程