我想使用線程運行同時在向量中檢查多個圖像。這裏是代碼在循環中提升Thread_Group速度非常慢
boost::thread_group tGroup;
for (int line = 0;line < sourceImageData.size(); line++) {
for (int pixel = 0;pixel < sourceImageData[line].size();pixel++) {
for (int im = 0;im < m_images.size();im++) {
tGroup.create_thread(boost::bind(&ClassX::ClassXFunction, this, line, pixel, im));
}
tGroup.join_all();
}
}
這創建了線程組,並通過像素數據行,然後循環每個像素,然後多個圖像。它是一個奇怪的項目,但無論如何,我將線程綁定到該代碼所在類的同一實例中的一個方法,因此使用「this」。它貫穿了大約20個圖像,在每個線程結束時進行綁定,然後在完成循環時,join_all函數在線程完成時生效。然後它進入下一個像素並重新開始。
心中已經測試運行在同一時間50個線程與這個簡單的程序
void run(int index) {
for (int i = 0;i < 100;i++) {
std::cout << "Index : " <<index<<" "<<i << std::endl;
}
}
int main() {
boost::thread_group tGroup;
for (int i = 0;i < 50;i++){
tGroup.create_thread(boost::bind(run, i));
}
tGroup.join_all();
int done;
std::cin >> done;
return 0;
}
這工作得非常快。即使線程在前一個程序中綁定的方法比較複雜,它不應該像現在這樣慢。一個循環的sourceImageData(行)需要4秒鐘才能完成。我是新來提高線程,所以我不知道是否是嵌套循環或其他方面的公然錯誤。任何見解都會被讚賞。
謝謝,這有助於加速了很多。我在第一個/主循環(行)下面像你說的那樣創建了一個線程,並將另外兩個線程移動到由線程調用的函數中。還有什麼可以做得更快的,比如清理,或者只是像8或10個線程一樣處於活動狀態,並且只是在'slot'打開之前正常調用這個函數呢? – Liger
確保只有_n_個線程處於活動狀態的方法是沒有更多的線程。所以更重要的是巧妙地在可用線程中分塊處理。你可能應該專注於沒有太小的任務(開銷過大),而不是太大(併發性太少) – sehe