c++中的向量和线程
vectors and threading in C++
我想请求关于如何解决矢量和线程问题的评论/想法,这变得有点复杂。我研究了这个问题,还没有找到一个可行的解决方案。
的目的是有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(); });
相关文章:
- 为什么一个向量上的多线程操作很慢
- C++在不同线程中改变向量
- C++:在多个线程中访问同一数组/向量的不同单元格是否会产生数据竞赛?
- 在线程函数中处理数据向量时进行线程竞速
- std::vector::clear()ing 二维向量线程的内部向量安全吗?
- 在不同的线程中调用向量析构函数或清除
- 为同一向量C++运行多个线程时出现分段错误
- 具有多线程支持的 RenderClass,将函数调用推送到向量以在另一个线程上调用
- C++中向量和列表的非写入成员函数的线程安全性
- 在向量上声明缩减,在 1 个线程上运行给出的结果与没有 openmp 的结果不同
- 为什么向量"emplace_back"在多个线程中的行为比单个线程慢得多
- 由 std::shared_ptr 向量指向的数据之间的线程同步
- 在 Valgrind 输出中仍然可以访问 std 线程向量的块
- 在为工作线程访问 lambda 中捕获的向量列表中的元素引用时,是否需要互斥锁?
- C++重用调用同一函数的线程向量
- 在 C++11 中计算字母和单词的双字母组合的 std::线程向量的问题
- 在循环中创建线程向量的问题
- 提升多线程向量的返回值
- 尝试用函数填充线程向量 - 错误
- 多线程向量