将派生类指针的向量传递给线程
Pass vector of derived class pointers to thread
我有一个包含 Derived1 和 Derived2 派生类的基类和一个 Consumer 类。
我想创建一个包含两个派生类对象的 Base 指针向量,然后传递给使用者类,以便它可以使用
pointervec.at(0).i
我已经坚持了很长时间,无法让它工作。这是我所拥有的简化版本。我担心创建向量、将其传递给线程和访问不同索引的语法。
#include<vector>
#include<thread>
#include<iostream>
using namespace std;
class Base
{
public:
Base() {};
void dosomething() {cout<<i<<endl;}
int i;
};
class Derived1 : public Base
{
public:
Derived1() {i = 5;}
};
class Derived2 : public Base
{
public:
Derived2() {i = 10;}
};
class Consumer
{
public:
Consumer();
void dostuff( vector<Base> &pointervec) {cout<<5<<endl;}
};
int main( int argc, char ** argv )
{
Derived1 derived1;
Derived2 derived2;
vector<Base*>pointervec;
pointervec.push_back(&derived1);
pointervec.push_back(&derived2);
std::thread t1(&Derived1::dosomething, &derived1);
std::thread t2(&Derived2::dosomething, &derived2);
std::thread t3(&Consumer::dostuff, ref(pointervec));
t1.join();
t2.join();
t3.join();
}
为了使您的示例正常工作,需要纠正一些错误。
- 由于
Consumer::doStuff
是一个非静态成员函数,因此需要一个Consumer
实例来运行它。 - 如上所述,
Consumer
需要一个定义的构造函数 doStuff
的签名需要采用(引用a)Base
指针的向量,而不是Base
对象- 线程
t3
需要所述Consumer
实例作为其第一个转发参数(以提供this
参数。
最终工作代码:
#include<vector>
#include<thread>
#include<iostream>
using namespace std;
class Base
{
public:
Base() {};
void dosomething() {cout<<i<<endl;}
int i;
};
class Derived1 : public Base
{
public:
Derived1() {i = 5;}
};
class Derived2 : public Base
{
public:
Derived2() {i = 10;}
};
class Consumer
{
public:
Consumer() {}
void dostuff( vector<Base*> &pointervec) {cout<<pointervec.at(0)->i<<endl;}
};
int main( int argc, char ** argv )
{
Derived1 derived1;
Derived2 derived2;
Consumer c;
vector<Base*>pointervec;
pointervec.push_back(&derived1);
pointervec.push_back(&derived2);
std::thread t1(&Derived1::dosomething, &derived1);
std::thread t2(&Derived2::dosomething, &derived2);
std::thread t3(&Consumer::dostuff, &c, ref(pointervec));
t1.join();
t2.join();
t3.join();
}
相关文章:
- 为什么一个向量上的多线程操作很慢
- C++在不同线程中改变向量
- C++:在多个线程中访问同一数组/向量的不同单元格是否会产生数据竞赛?
- 在线程函数中处理数据向量时进行线程竞速
- std::vector::clear()ing 二维向量线程的内部向量安全吗?
- 在不同的线程中调用向量析构函数或清除
- 为同一向量C++运行多个线程时出现分段错误
- 具有多线程支持的 RenderClass,将函数调用推送到向量以在另一个线程上调用
- C++中向量和列表的非写入成员函数的线程安全性
- 在向量上声明缩减,在 1 个线程上运行给出的结果与没有 openmp 的结果不同
- 为什么向量"emplace_back"在多个线程中的行为比单个线程慢得多
- 由 std::shared_ptr 向量指向的数据之间的线程同步
- 在 Valgrind 输出中仍然可以访问 std 线程向量的块
- 在为工作线程访问 lambda 中捕获的向量列表中的元素引用时,是否需要互斥锁?
- C++重用调用同一函数的线程向量
- 在 C++11 中计算字母和单词的双字母组合的 std::线程向量的问题
- 在循环中创建线程向量的问题
- 提升多线程向量的返回值
- 尝试用函数填充线程向量 - 错误
- 多线程向量