C++ 为QtConcurrent::mapped中的每个线程使用独立资源
我正在通过QtConcurrent::mapped处理大量数据(其中1000个或更多)C++ 为QtConcurrent::mapped中的每个线程使用独立资源,c++,qt,C++,Qt,我正在通过QtConcurrent::mapped处理大量数据(其中1000个或更多) auto result = QtConcurrent::mapped(image_id, std::bind<std::pair<QString, QImage>>(&mainWindow::process_image_impl, this, ph::_1)); 我想做一些像 void process_image_impl(int image_id) { //.....
auto result = QtConcurrent::mapped(image_id, std::bind<std::pair<QString, QImage>>(&mainWindow::process_image_impl, this, ph::_1));
我想做一些像
void process_image_impl(int image_id)
{
//.......lots of codes
morphology[thread_id].close(image, image); //I don't want to lock this operation
//lots of codes
}
在函数过程\u image\u impl中,我调用了一个名为“形态学”的类,我不想
当我处理图像时锁定“形态学”类,但是如果我不锁定它,我可能会
导致未定义的行为。我不想锁定进程,而是将
对容器中的“形态学”进行分类,并根据
QThreadPool中的线程,这是可能的吗?或者您有其他建议吗?谢谢多线程是可能的解决方案之一,这取决于调用“形态学”类的次数、运行代码时使用的操作系统以及使用的处理器等等。所有这些都会影响代码在运行时的性能,这取决于您的预期。如果您想采用多线程方法,那么只需创建一个指向“形态学”类的指针和另一个指向“QThread”的指针,然后使用“moveToThread(&thread)”将其移动到线程。例如,请检查此链接: 另外,如果您希望您的程序具有响应性,并且在处理过程中不被锁定,那么多线程也是一种方法,前提是只需要在线程内访问形态学
qt存储形态;
无效进程\u图像\u impl(整数图像\u id){
//很多代码
如果(!mophy.hasLocalData())mophy.setLocalData(mophy());
形态学.localData().close(图像,图像);
//很多代码
}
如果还需要在线程外部访问形态学
模板
类ThreadSafeStack:private QStack{
QMutex互斥;
公众:
T*pop(){
QMutexLocker锁柜(&mutex);
return!isEmpty()?QStack::pop():new T;
}
无效推送(T*&T){
QMutexLocker锁柜(&mutex);
QStack::push(t);
}
};
线程安全堆栈;
无效进程\u图像\u impl(整数图像\u id){
//很多代码
形态学*形态学=stack.pop();
形态学->关闭(图像,图像);
叠加推(形态学);
//很多代码
}
我认为您需要研究线程本地存储,但Qt没有跨平台的实现,因此您需要使用平台的本地存储。
void process_image_impl(int image_id)
{
//.......lots of codes
morphology[thread_id].close(image, image); //I don't want to lock this operation
//lots of codes
}
QThreadStorage<Morphology> morphology;
void process_image_impl(int image_id) {
//lots of codes
if (!morphology.hasLocalData()) morphology.setLocalData(Morphology());
morphology.localData().close(image, image);
//lots of codes
}
template <class T>
class ThreadSafeStack: private QStack<T*> {
QMutex mutex;
public:
T* pop() {
QMutexLocker locker(&mutex);
return !isEmpty() ? QStack::pop() : new T;
}
void push(T* &t) {
QMutexLocker locker(&mutex);
QStack::push(t);
}
};
ThreadSafeStack<Morphology> stack;
void process_image_impl(int image_id) {
//lots of codes
Morphology *morphology = stack.pop();
morphology->close(image, image);
stack.push(morphology);
//lots of codes
}