我想征询有关如何解决向量和线程问题的意见/想法,这些问题正变得有些令人费解。我已经研究了这个问题,但没有找到可行的解决方案。
目的是要有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));
有什么想法可以解决这个问题吗?
指向方法的指针必须使用指定类和方法的指针的组合以及要在其上调用所述方法的所述类的实例来调用。
这东西:
&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] 删除。
我来说两句