我想就如何解决变得有点复杂的矢量和线程问题征求意见/想法。我已经研究过这个问题,但还没有找到可行的解决方案。
目的是拥有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));
我有什么想法可以解决这个问题?
答案 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(); });