C ++包含线程函数的对象向量错误

时间:2013-11-25 07:03:26

标签: c++ multithreading vector openframeworks

你知道任何方法(C ++)来创建包含线程函数的对象向量吗?理想情况下,该技术必须是跨平台(Win / OSX)并且易于移植到移动(iOS)。它可以是非常基本的多线程,并行运行的功能非常简单(但计算密集)。

我正在编写一个具有许多对象(属于同一个类)的应用程序,这些对象具有非常复杂的数据结构,需要并行分析:主应用程序线程负责与用户交互并渲染场景, object在不同的线程上并行分析其数据。

到目前为止,我尝试在OpenFrameworks(使用ofThread)中对应用程序进行原型设计,但是一旦我开始创建包含线程函数的对象向量,编译器就会抛出一些奇怪的错误(参见下面的参考资料)。 / em>的

(OpenFrameworks示例)

class MyClass: public ofThread
{
     int A, B, C;
     void threadedFunction();
     MyClass();
}

...如果我实例化该类(运行其方法,包括线程函数)没问题。

然后我创建了这个类的向量:

// in main function
...
vector<MyClass> myList;

...但是现在,当我尝试将类的实例添加到向量时,编译器无法说它无法访问类Poco中的privte成员:FastMutex(utils \ ofthread.h(190) ):错误C2248:'Poco :: FastMutex :: FastMutex':无法访问类'Poco :: FastMutex'中声明的私有成员和Poco:Thread(utils \ ofthread.h(190):错误C2248:'Poco :: Thread :: Thread':无法访问类'Poco :: Thread'中声明的私有成员)

// in main function
...
myList.push_back(MyClass());    //ERROR!

// in main function
...
MyClass temp;              //OK SO FAR
myList.push_back(temp);    //ERROR!

欢迎任何帮助!

2 个答案:

答案 0 :(得分:3)

您无法复制互斥锁。您的push_back函数会尝试在向量中创建MyClass的新实例,作为temp的副本。您可以使用智能指针向量。

答案 1 :(得分:1)

在openFrameworks中,我们有一个名为typedef的{​​{1}},它会尝试包裹ofPtr。避免它,因为它很快就会消失。相反,我建议使用std::shared_ptr<>,这对openFrameworks目前支持的所有平台都可用。例如:

std::shared_ptr<>

当您从向量中删除对象时,// Your .h header file std::vector<shared_ptr<YourClass> > vectorOfYourClassInstances; // Your .cpp/.mm implementation file std::shared_ptr<YourClass> yourClassInstance = std::shared_ptr<YourClass>(new YourClass); vectorOfYourClassInstances.push_back(yourClassInstance); // The place where you are using your class // Iterate through using an index or an iterator // std::vector<shared_ptr<YourClass> >::iterator ... for(std::size_t i = 0; i < vectorOfYourClassInstances.size(); ++i) { std::shared_ptr<YourClass> onOfYourClassInstances = vectorOfYourClassInstances[i]; onOfYourClassInstances->makeItDoAThing(); // make it do a thing } 将跟踪引用的数量,并会调用您的类的析构函数(std::shared_ptr)自动为您释放内存。

目前openFrameworks并不完全支持C ++ 11(它正在积极开发中),但是到时候,您可以使用C ++ 11的YourClass::~YourClass() { }函数,如果是,则可以使用std::make_shared更适合您的应用。