含螺纹函数对象向量的C++误差 你知道用C++来创建包含线程函数的对象向量吗?理想情况下,该技术必须是跨平台Win/OSX,并且易于移植到移动iOS。它可以是非常基本的多线程处理,并行运行的函数非常简单,但计算量很大
我正在编写一个应用程序,其中有许多属于同一类的对象,它们的数据结构相当复杂,需要并行分析:虽然主应用程序线程负责与用户交互并渲染场景,但每个对象都在单独的线程上并行分析其数据 到目前为止,我试图使用ofThread在OpenFrameworks中创建应用程序的原型,但一旦我开始创建包含线程函数的对象向量,编译器就会抛出一些奇怪的错误,请参阅下文 OpenFrameworks示例 。。。如果我实例化这个类,运行它的方法,包括线程函数,没有问题 然后创建此类的向量:含螺纹函数对象向量的C++误差 你知道用C++来创建包含线程函数的对象向量吗?理想情况下,该技术必须是跨平台Win/OSX,并且易于移植到移动iOS。它可以是非常基本的多线程处理,并行运行的函数非常简单,但计算量很大,c++,multithreading,vector,openframeworks,C++,Multithreading,Vector,Openframeworks,我正在编写一个应用程序,其中有许多属于同一类的对象,它们的数据结构相当复杂,需要并行分析:虽然主应用程序线程负责与用户交互并渲染场景,但每个对象都在单独的线程上并行分析其数据 到目前为止,我试图使用ofThread在OpenFrameworks中创建应用程序的原型,但一旦我开始创建包含线程函数的对象向量,编译器就会抛出一些奇怪的错误,请参阅下文 OpenFrameworks示例 。。。如果我实例化这个类,运行它的方法,包括线程函数,没有问题 然后创建此类的向量: // in main funct
// in main function
...
vector<MyClass> myList;
欢迎任何帮助 不能复制互斥体。您的push_back函数尝试在向量中创建MyClass的新实例作为temp的副本。您可以使用智能指针向量来代替。您不能复制互斥体。您的push_back函数尝试在向量中创建MyClass的新实例作为temp的副本。您可以使用智能指针向量来代替。在openFrameworks中,我们有一个名为ofPtr的typedef,它试图包装std::shared\u ptr。避免它,因为它可能很快就会消失。相反,我建议使用std::shared_ptr,它可用于openFrameworks当前支持的所有平台。例如:
// 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将跟踪引用的数量,并将调用类的析构函数YourClass::~YourClass{}自动为您释放内存
目前openFrameworks并不完全支持C++11,它正在积极开发中,但到时候,如果更适合您的应用程序,您可以使用C++11的std::make_共享函数和潜在的std::unique_ptr 在openFrameworks中,我们有一个名为ofPtr的typedef,它试图包装std::shared\u ptr。避免它,因为它可能很快就会消失。相反,我建议使用std::shared_ptr,它可用于openFrameworks当前支持的所有平台。例如:
// 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将跟踪引用的数量,并将调用类的析构函数YourClass::~YourClass{}自动为您释放内存
目前openFrameworks并不完全支持C++11,它正在积极开发中,但到时候,如果更适合您的应用程序,您可以使用C++11的std::make_共享函数和潜在的std::unique_ptr 我猜FastMutex不是std::vector所要求的可复制或可移动的。你可以通过在向量中存储一个智能指针而不是对象本身来实现它。std::vector有什么问题吗?我猜FastMutex是不可复制或移动的,std::vector需要这样做。通过在向量中存储智能指针而不是对象本身,您可能可以让它工作。std::vector有什么问题吗?
// in main function
...
MyClass temp; //OK SO FAR
myList.push_back(temp); //ERROR!
// 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
}