跳转至

MultiThread.h

Go to the source code of this file.

ExampleMultiThreadMultiModels.cpp示例。

本示例描述了如何在多个线程中使用多个模型。 多线程是一种用于同时执行多个任务的方法。 在SAIGE VISION的Runtime检查功能的情况下,它并不总是线程安全的。 因此,应以适当的方式使用多个线程。

Note

重要:一个线程应使用一个SAIGE VISION句柄。

检查句柄不是线程安全的。 在多个线程中使用一个句柄可能会导致意外结果。 因此,每个工作线程应使用不同的检查句柄。

本示例从创建要在每个句柄中使用的模型列表开始。 在本示例中,所有句柄都使用相同的模型文件。

43
44
45
46
47
48
49
50
// 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;
    }
}

Warning

使用相同模型文件时的注意事项:影响模型文件的以下操作在使用相同模型文件时可能会失败。 在 SAIGE_OPTIMIZE_HANDLE 的情况下,如果使用相同的模型,可能会失败,因为创建了优化的模型文件。 如果多个句柄访问相同的模型,则尝试访问文件的第一个句柄将自动创建文件,而其他句柄将返回函数错误代码。 在 SaigeSetInferenceOption 的情况下,如果使用 SAIGE_WRITE_ON_MODEL_FILE 标志, 则可能会意外更改存储在模型文件中的推理选项,因此无法使用。

在本示例中,我们使用自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] {

加入所有线程以等待所有线程运行并退出。

464
465
466
467
468
// ExampleMultiThreadMultiModels.cpp:466

for (auto& th : threads) {
    th.join();
}