gpt4 book ai didi

c++ - C++ 中的 vector 和线程

转载 作者:搜寻专家 更新时间:2023-10-31 02:15:08 25 4
gpt4 key购买 nike

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

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

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

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,
  • 然后是 Person 的未指定实例中的 vector,它不包含任何此类 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)();
}
};

关于c++ - C++ 中的 vector 和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39022892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com