Ошибка С++ в векторе объектов, содержащих многопотоковую функцию

знаете ли вы какой-либо метод (С++) для создания вектора объектов, содержащих многопоточную функцию? В идеале метод должен быть кроссплатформенным (Win/OSX) и легко переносимым на мобильные устройства (iOS). Это может быть очень простая многопоточность, функция, которую нужно запускать параллельно, довольно проста (но требует больших вычислительных ресурсов).

Я пишу приложение со многими объектами (принадлежащими одному классу) с довольно сложной структурой данных, которую необходимо анализировать параллельно: в то время как основной поток приложения заботится о взаимодействии с пользователем и рендеринге сцены, каждый объект получает свою данные анализируются параллельно в отдельных потоках.

До сих пор я пытался создать прототип приложения в OpenFrameworks (используя ofThread), но как только я начинаю создавать вектор объектов, содержащих многопоточную функцию, компилятор выдает несколько странных ошибок (см. ниже для справки).

(пример OpenFrameworks)

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

... если я создаю экземпляр класса (запускаю его методы, включая многопоточную функцию), проблем нет.

Затем я создаю вектор этого класса:

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

... но теперь, как только я пытаюсь добавить экземпляр класса в вектор, компилятор не сообщает, что он не может получить доступ к членам privte в классе Poco: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!

Любая помощь приветствуется!


person mαττjαĸøb    schedule 25.11.2013    source источник
comment
Полагаю, я бы сказал, что FastMutex нельзя копировать (или перемещать), что требуется для std::vector. Вероятно, вы можете заставить его работать, сохранив интеллектуальный указатель в векторе, а не в самом объекте.   -  person Jonathan Potter    schedule 25.11.2013
comment
Что-то не так с std::vector<std::thread>?   -  person juanchopanza    schedule 25.11.2013


Ответы (2)


Вы не можете сделать копию мьютекса. Ваша функция push_back пытается создать новый экземпляр MyClass в векторе как копию temp. Вместо этого вы можете использовать вектор интеллектуальных указателей.

person David Schwartz    schedule 25.11.2013

В openFrameworks у нас есть typedef с именем ofPtr, который пытается обернуть std::shared_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_shared и потенциально std::unique_ptr, если это больше подходит для вашего приложения.

person bakercp    schedule 25.11.2013