使用多线程加速处理这一段vector<Edge1D_Result>edges;for (int i = 0; i < m; i++) { edges = Extract1DEdgeCircle.Get1DEdge(RoiMat, m_vpdEquinoxPoints[i], m_dMeasureLength, m_dMeasureHeight, m_vdMeasureAngle[i] , m_dSigma, m_nThresholdCircle, m_nTranslationCircle == 1 ? Translation::Poisitive : Translation::Negative, Selection::Strongest); for (int i = 0; i < edges.size(); i++) { m_vpdEdgePoints.push_back(edges[i].m_pdEdgePoint); m_vdEdgeGradient.push_back(edges[i].m_dGradient); } }保护变量edges
时间: 2023-12-10 09:40:27 浏览: 26
可以使用std::mutex来保护变量edges。具体实现如下:
1. 在头文件中添加#include<mutex>
2. 在成员变量中添加std::mutex m_mutex;
3. 在对edges进行操作的代码块前后加上锁和解锁操作:
```
m_mutex.lock();
for (int i = 0; i < m; i++) {
edges = Extract1DEdgeCircle.Get1DEdge(RoiMat, m_vpdEquinoxPoints[i], m_dMeasureLength, m_dMeasureHeight, m_vdMeasureAngle[i] , m_dSigma, m_nThresholdCircle, m_nTranslationCircle == 1 ? Translation::Poisitive : Translation::Negative, Selection::Strongest);
for (int i = 0; i < edges.size(); i++) {
m_vpdEdgePoints.push_back(edges[i].m_pdEdgePoint);
m_vdEdgeGradient.push_back(edges[i].m_dGradient);
}
}
m_mutex.unlock();
```
这样保证了在一个线程对edges进行操作时,其他线程无法同时访问edges。
相关问题
使用多线程加速处理这一段for循环vector<Edge1D_Result>edges;for (int i = 0; i < m; i++) { edges = Extract1DEdgeCircle.Get1DEdge(RoiMat, m_vpdEquinoxPoints[i], m_dMeasureLength, m_dMeasureHeight, m_vdMeasureAngle[i] , m_dSigma, m_nThresholdCircle, m_nTranslationCircle == 1 ? Translation::Poisitive : Translation::Negative, Selection::Strongest); for (int i = 0; i < edges.size(); i++) { m_vpdEdgePoints.push_back(edges[i].m_pdEdgePoint); m_vdEdgeGradient.push_back(edges[i].m_dGradient); } }保护变量edges
可以使用C++11的std::mutex来保护变量edges,确保多个线程不会同时访问和修改它。
首先,在头文件中包含<mutex>:
```c++
#include <mutex>
```
然后,在定义vector<Edge1D_Result>edges之前,定义一个全局的std::mutex对象:
```c++
std::mutex mtx;
```
接下来,在for循环中对edges的访问和修改需要加锁和解锁:
```c++
for (int i = 0; i < m; i++) {
std::vector<Edge1D_Result> temp_edges;
temp_edges = Extract1DEdgeCircle.Get1DEdge(RoiMat, m_vpdEquinoxPoints[i], m_dMeasureLength, m_dMeasureHeight, m_vdMeasureAngle[i] , m_dSigma, m_nThresholdCircle, m_nTranslationCircle == 1 ? Translation::Poisitive : Translation::Negative, Selection::Strongest);
// 加锁
mtx.lock();
for (int i = 0; i < temp_edges.size(); i++) {
m_vpdEdgePoints.push_back(temp_edges[i].m_pdEdgePoint);
m_vdEdgeGradient.push_back(temp_edges[i].m_dGradient);
}
mtx.unlock(); // 解锁
}
```
在加锁之前,我们需要定义一个临时的vector<Edge1D_Result>来存储Extract1DEdgeCircle.Get1DEdge()函数返回的结果,以免因为加锁时间过长导致函数返回的结果被覆盖。
这样做可以确保多个线程不会同时访问和修改变量edges,从而避免了数据竞争和意外的结果。
创建多线程加速处理这一段for循环vector<Edge1D_Result>edges;for (int i = 0; i < m; i++) { edges = Extract1DEdgeCircle.Get1DEdge(RoiMat, m_vpdEquinoxPoints[i], m_dMeasureLength, m_dMeasureHeight, m_vdMeasureAngle[i] , m_dSigma, m_nThresholdCircle, m_nTranslationCircle == 1 ? Translation::Poisitive : Translation::Negative, Selection::Strongest); for (int i = 0; i < edges.size(); i++) { m_vpdEdgePoints.push_back(edges[i].m_pdEdgePoint); m_vdEdgeGradient.push_back(edges[i].m_dGradient); } }变量不冲突
可以使用多线程来加速这个循环,可以将循环中的每一个元素都分配给不同的线程进行处理,这样就可以同时处理多个元素,从而提高程序的运行效率。
下面是一个简单的示例代码,展示如何使用多线程来处理这个循环:
```
#include <iostream>
#include <vector>
#include <thread>
struct Edge1D_Result {
double m_pdEdgePoint;
double m_dGradient;
};
class Extract1DEdgeCircle {
public:
std::vector<Edge1D_Result> Get1DEdge(int RoiMat, int m_vpdEquinoxPoints, double m_dMeasureLength, double m_dMeasureHeight, double m_vdMeasureAngle, double m_dSigma, int m_nThresholdCircle, int m_nTranslationCircle, int Selection) {
// 实现代码
return std::vector<Edge1D_Result>();
}
};
int main() {
int m = 10;
Extract1DEdgeCircle Extract1DEdgeCircle;
std::vector<Edge1D_Result> m_vpdEdgePoints;
std::vector<double> m_vdEdgeGradient;
std::vector<std::thread> threads;
for (int i = 0; i < m; i++) {
threads.emplace_back([&Extract1DEdgeCircle, &m_vpdEdgePoints, &m_vdEdgeGradient, i]() {
std::vector<Edge1D_Result> edges = Extract1DEdgeCircle.Get1DEdge(RoiMat, m_vpdEquinoxPoints[i], m_dMeasureLength, m_dMeasureHeight, m_vdMeasureAngle[i], m_dSigma, m_nThresholdCircle, m_nTranslationCircle == 1 ? Translation::Poisitive : Translation::Negative, Selection::Strongest);
for (int i = 0; i < edges.size(); i++) {
m_vpdEdgePoints.push_back(edges[i].m_pdEdgePoint);
m_vdEdgeGradient.push_back(edges[i].m_dGradient);
}
});
}
for (auto& thread : threads) {
thread.join();
}
return 0;
}
```
在这个示例代码中,我们首先创建了一个 `threads` 向量来存储所有的线程。然后,在循环中,我们使用 `emplace_back` 函数向 `threads` 向量中添加一个新的线程,并且将当前元素的处理放在这个线程的函数中。在这个函数中,我们调用 `Extract1DEdgeCircle.Get1DEdge` 函数来处理当前元素,并且将处理结果保存到 `m_vpdEdgePoints` 和 `m_vdEdgeGradient` 向量中。
最后,我们使用 `join` 函数来等待所有的线程结束。这样,就可以实现对于这个循环的多线程并发处理,从而提高程序的运行效率。