MultiThread.h
Go to the source code of this file.
ExampleMultiThreadMultiModels.cpp示例。
本示例描述了如何在多个线程中使用多个模型。 多线程是一种用于同时执行多个任务的方法。 在SAIGE VISION的Runtime检查功能的情况下,它并不总是线程安全的。 因此,应以适当的方式使用多个线程。
Note
重要:一个线程应使用一个SAIGE VISION句柄。
检查句柄不是线程安全的。 在多个线程中使用一个句柄可能会导致意外结果。 因此,每个工作线程应使用不同的检查句柄。
本示例从创建要在每个句柄中使用的模型列表开始。 在本示例中,所有句柄都使用相同的模型文件。
| // ExampleMultiThreadMultiModels.cpp:45
std::string dataDir =
get_env_var("SAIGE_HOME") + "/SaigeVision/engine/Examples/data/sfaw2023/images/test/";
// 사용할 모델 목록
std::vector<std::string> modelPathList = {dataDir + "../../models/seg_example.saigeseg",
dataDir + "../../models/seg_example.saigeseg"};
|
然后声明要使用的句柄变量并创建每个句柄。 在这里,每个工作线程一次检查一个图像,并为每个线程使用一个结果句柄。
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106 | // ExampleMultiThreadMultiModels.cpp:75
std::vector<SaigeInferenceHandle> handles(modelPathList.size(), nullptr);
std::vector<SaigeInferenceResult> results(modelPathList.size(), nullptr);
/***********************************************************
* 1. 모델 파일 및 검사 결과 핸들 생성,
* Create handles for model files and inference results
***********************************************************/
for (size_t i = 0; i < handles.size(); ++i) {
SaigeHandleConfig config;
config.inspectionSizeHeight = 2496;
config.inspectionSizeWidth = 2496;
unsigned int handleFlags = SAIGE_SET_INSPECTION_SIZE;
if (optimize) {
handleFlags |= SAIGE_OPTIMIZE_HANDLE;
}
retval = SaigeCreateInferenceHandle(&handles[i], kProjectTypeSEG, modelPathList[i].c_str(),
deviceIndex, &config, handleFlags);
if (retval < 0) {
std::cerr << "SaigeCreateInferenceHandle failed - " << SaigeStrError(retval)
<< std::endl;
return retval;
}
retval = SaigeCreateInferenceResult(&results[i]);
if (retval < 0) {
std::cerr << "SaigeCreateInferenceResult failed - " << SaigeStrError(retval)
<< std::endl;
return retval;
}
}
|
在本示例中,我们使用自C++11起可用的 std::thread 和 lambda函数定义了每个工作线程的工作。 作业的内容与其他示例类似。
300
301
302
303
304
305
306
307 | // ExampleMultiThreadMultiModels.cpp:302
std::vector<std::thread> threads{};
for (size_t i = 0; i < handles.size(); ++i) {
threads.push_back(std::thread([verbosity, detailedTime, overlayAlpha, waitkeyMilliSecond,
imagePaths, handle = handles[i], result = results[i],
modelInfo = &modelInfos[i], modelNum = i] {
|
加入所有线程以等待所有线程运行并退出。
| // ExampleMultiThreadMultiModels.cpp:466
for (auto& th : threads) {
th.join();
}
|