2.2 使用 HALCON 进行并行编程

HALCON 通过线程安全可重入特性支持并行编程,即不同线程可以同时调用 HALCON 算子,而无需等待。不过,并非所有算子都是完全可重入的。本节将对 HALCON 的重入性进行更深入的探讨。此外,它还指出了在编写使用 HALCON 的并行程序时应注意的问题。

example\c 目录中的示例程序 example_multithreaded1.c 演示了如何使用 HALCON/C 并行提取电路板上不同类型的组件。

此外,HALCON 还提供了用于同步线程的特殊算子(参见 "多线程算子" 一节 )。

2.2.1 仔细观察重入性

事实上,HALCON 算子的重入性有不同的 "级别":

  1. 重入
    如果一个算子可以同时被多个线程调用,且与调用的数据无关,那么它就是完全重入的。

    当多个线程使用相同的数据对象(如相同的图像变量)时要特别注意。在这种情况下,必须使用相应的并行编程机制(互斥、信号量)手动同步对该变量的访问。更好的办法是尽量避免这种情况,即使用局部变量。请注意,这不是 HALCON 的特殊问题,而是一般并行编程的问题。

  2. 本地
    标记为本地的算子只能在实例化相应对象的线程中调用。

  3. 单次写入,多次读取
    只有当不同的调用线程处理不同的数据时,才能同时调用某组算子。

    由于一般不建议使用这种线程行为,因此 HALCON 不会主动阻止这种行为,从而节省了开销。这意味着,如果您(不小心)用相同的数据同时调用此类算子,虽然不会阻塞线程,但可能会产生不良后果。

  4. 互斥
    某些算子不能被多个线程同时调用,但可以与其他 HALCON 算子并行执行。

  5. 独占
    一组算子只能由 HALCON 执行,也就是说,在执行该算子时,所有其他线程都不能调用另一个 HALCON 算子。

  6. 独立
    一组算子的执行独立于其他算子,甚至是排他性算子。

如前所述,参考手册中对 HALCON 算子的描述包含一个名为 "执行信息" 的条目,其中规定了算子在使用 HALCON 时的行为。如上所述,该条目指定了重入级别。

2.2.2 并行化程序设计问题

一般来说,多线程编程必须考虑以下问题:

使用 HALCON 时,请注意以下问题:

2.2.3 多线程算子

在算子部分 系统多线程 一节中,HALCON 提供了用于创建和使用同步对象的算子,如互斥、事件、条件变量和屏障。

有了它们,你就能以一种与平台无关的方式同步线程。不过要注意的是,到目前为止还没有提供创建线程的算子。

2.2.4 示例

HALCON 目前提供以下并行编程示例(路径相对于 %HALCONEXAMPLES%):

HALCON/C

HALCON/.NET

HALCON/C++