要解決此特定問題英特爾®線程構建模塊庫包含特殊結構。 Intel® TBB是跨平臺的庫,它有助於多線程編程。 我們可以在四個不同的任務提供者處查看應用程序中涉及的實體。一種類型的任務是輸入任務 - 那些提供輸入數據的任務,另一種類型的任務由第一個操作例程提供,等等。
因此,用戶需要做的唯一事情就是爲這些任務提供正文。庫中有幾個API用於指定要處理的物體以及如何並行處理。其他一切(這裏我指的是線程創建,任務執行之間的同步,工作平衡等)由庫完成。
我想到的最簡單的解決方案是使用parallel_pipeline函數。這裏是原型:
#include "tbb/pipeline.h"
using namespace tbb;
int main() {
parallel_pipeline(/*specify max number of bodies executed in parallel, e.g.*/16,
make_filter<void, input_data_type>(
filter::serial_in_order, // read data sequentially
[](flow_control& fc) -> input_data_type {
if (/*check some stop condition: EOF, etc.*/) {
fc.stop();
return input_data_type(); // return dummy value
}
auto input_data = read_data();
return input_data;
}
) &
make_filter<input_data_type, manipulator1_output_type>(
filter::parallel, // process data in parallel by the first manipulator
[](input_data_type elem) -> manipulator1_output_type {
auto processed_elem = manipulator1::process(elem);
return processed_elem;
}
) &
make_filter<manipulator1_output_type, manipulator2_output_type>(
filter::parallel, // process data in parallel by the second manipulator
[](manipulator1_output_type elem) -> manipulator2_output_type {
auto processed_elem = manipulator2::process(elem);
return processed_elem;
}
) &
make_filter<manipulator2_output_type, void>(
filter::serial_in_order, // visualize frame by frame
[](manipulator2_output_type elem) {
visualize(elem);
}
)
);
return 0;
}
前提是必需的功能(的read_data,可視化)被實現。這裏input_data_type
,manipulator1_output_type
等是在流水線階段之間傳遞的類型,並且操縱器的process
函數對傳遞的參數進行必要的計算。
順便說一句,爲避免使用鎖和其他同步原語工作,可以使用庫中的concurrent_bounded_queue,並將輸入數據放入此隊列中,可能由不同的線程(例如專用於IO操作)組成,如concurrent_bounded_queue_instance.push(elem)
,以及然後通過input_data_type elem; concurrent_bounded_queue_instance.pop(elem)
閱讀。請注意,在這裏彈出一個項目是一個阻塞操作。 concurrent_queue
提供了非阻塞try_pop
的替代方案。
另一種可能性是使用tbb::flow_graph
及其節點來組織相同的流水線方案。看看描述dependency和data流程圖的兩個示例。您可能需要使用sequencer_node來正確排序項目執行(如有必要)。
這是值得閱讀標記tbb標記SO看看其他人如何使用這個庫。
什麼是「緩衝塊」的含義實驗?函數調用塊,而不是數據結構。 –
@KerrekSB:你說得對。我的意思是讀取電話會阻塞,直到有緩衝區中的數據 – marcman
我想你應該看看[消費者/製造商問題](https://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem ) – cbuchart