机器视觉_HALCON_编程指南_多线程编程

news2024/7/2 4:13:58

文章目录

  • 一、前言
  • 二、HALCON并行编程
    • 2.1 深入可重入性⭐
    • 2.2 多线程编程设计问题
    • 2.3 多线程算子
    • 2.4 示例
  • 三、结语


一、前言

本文是HALCON的 programmers_guide(编程指南) 中的2.2章节,章节名直译是——用HALCON进行并行编程,实际上就是多线程编程嘛。因为HALCON是机器视觉软件,涉及图像处理,图像处理往往就会牵扯到多线程,所以这章非常重要。它会给你一些多线程编程的建议与参考。


二、HALCON并行编程

HALCON通过线程安全(thread-safe)和可重入(reentrant)来支持并行编程,即不同线程可同时调用HALCON算子而无需等待。不过,并非所有算子都是完全可重入的。本节会详细介绍HALCON的可重入性。此外,还会指出用HALCON多线程编程时应注意的问题。

文件目录example\c中的示例程序example_multithread1.c展示了如何使用HALCON/C进行多线程处理,以并行提取板子上不同类型的部件。

此外,HALCON提供了特殊的算子来同步线程。

2.1 深入可重入性⭐

HALCON算子的可重入性分不同等级:

  1. reentrant(可重入的)
    如果一个算子可以在不受调用数据影响的情况下同时被多个线程调用,那么它就是完全可重入的。

    请注意,当多个线程使用相同的数据对象时(如同一个图像变量),你必须特别小心。该情况下,你必须使用相应的并行编程机制(互斥锁、信号量)同步对该变量的访问。更好的做法是尽可能避免这种情况,即使用局部变量。这不是HALCON特有的问题,而是并行编程普遍存在的问题。

  2. local(局部的)
    标记为 local 的算子应仅从实例化相应对象的线程中调用。

  3. single write multiple read(单写多读)
    仅当不同调用线程在处理不同数据时,才能同时调用的某些组的算子。

    尽管这种线程行为通常是不推荐的,但HALCON并不会主动阻止它(因为可以节省一部分性能开销)。这意味着,如果你(没注意、不小心)用相同数据同时调用这些算子时,虽然没有线程会阻塞,但可能会得到不想要的结果。

  4. mutually exclusive(互斥的)
    有些算子无法被多个线程同时调用,但可以与其它HALCON算子并行执行。

  5. exclusive(独占的)
    有一些组的算子是由HALCON独占执行,也就是说,在执行这些算子时,所有其它线程都无法调用其它HALCON算子。

  6. independent(独立的)
    还有的算子完全独立于其它算子执行,即使是独占的算子。

正如前面所述,在参考手册中HALCON算子的描述包含了一个叫做“Parallelization”的项,用于指定在使用HALCON时的行为。该项根据上面描述指定了可重入性的级别(没找到,大概是下图中框出的信息?)。
在这里插入图片描述

2.2 多线程编程设计问题

通常,多线程编程要考虑下面问题:

  • 线程数量≤处理器或核的数量
    如果你使用的线程数大于处理器或处理核心的数量,由于同步的开销,应用程序实际上可能比之前更慢。请注意,仅统计持续工作的相关线程。
  • 局部变量
    尽可能使用局部变量,即在使用它们的线程中实例化变量。若多个线程使用相同的变量,则必须使用适当的并行编程构造(mutex互斥锁、semaphore信号量)同步它们对变量的访问(详细信息,参阅编程语言文档)。

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

  • Initialization(初始化)
    在多线程程序中并行调用HALCON算子之前,必须先独占式调用一个算子。为了让HALCON初始化其内部结构,这是必要的。
  • I/O与可视化
    请记住,创建或删除文件的算子是独占的(exclusive),即其它线程必须等待。程序员必须确保线程不会同时访问同一文件(或句柄(handle))。
  • 多线程与自动并行化
    若你在多线程程序中显式地平衡多个处理器或核心的负载,建议关闭自动并行化机制,以获得最佳性能(或减少使用的线程数,以使线程总数不超过处理器或核心数)。

2.3 多线程算子

在算子部分“System.Multithreading”中,HALCON提供了用于创建和使用同步对象的算子,例如互斥锁、事件、条件变量和屏障(barrier)。使用它们,你可以以平台无关的方式同步线程。

2.4 示例

目前,HALCON提供了以下并行编程示例(相对路径为%HALCONEXAMPLES%):
HALCON/.NET

  • c#\MultiThreading (C#)
    在三个线程中执行图像采集、处理和显示。
  • hdevengine\c#\MultiThreading (C#)
    使用HDevEngine,通过两个线程并行执行相同的HDevelop过程。
  • hdevengine\c#\MultiThreadingTwoWindows (C#)
    executes different HDevelop procedures in parallel by two threads using HDevEngine
    使用HDevEngine,通过两个线程并行执行不同的HDevelop过程。

三、结语

实话讲,看完这节,并没有给我带来很大的启发。
印象比较深的应该是可重入性的分级,因为几乎每个算子的执行信息(Execution information)中都有一项多线程类型,通过该类型可以知道算子在多线程下调用的注意事项(程度)。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/599003.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++入门:命名空间、函数重载、缺省参数

目录 一:命名空间 1.命名空间的意义 2.命名空间的定义 3.如何使用命名空间中成员? 小结 二:C的输入输出 三:函数重载 1.概念 2.实例 3.为什么C能支持函数重载而C不行? 【1】先看一段C语言代码 【2】我们把上…

基于单片机的七彩音乐喷泉设计

目录 一、方案流程及技术规格书设计 二、系统硬件电路设计 三、软件编写及调试 四、系统调试测试与分析 前言 随着时代的进步,人们对生活质量的要求也在不断提升,因此,51单片机七彩音乐喷泉系统应运而生,它不仅可以满足人们对…

I.MX RT1170加密启动详解(3):HAB加密启动原理

上一节使用对镜像进行签名认证,这可以防止镜像被篡改。但我们还是希望Flash中的程序不会被别人看到,所以这就需要加密启动了。 文章目录 1 HAB加密启动流程2 扩展知识: DCP和SNVS 1 HAB加密启动流程 如下图所示就是HAB加密启动的整个流程&a…

蓝桥杯国赛备赛(嵌入式组)

一、数码管(拓展板)(共阴接法) 引脚控制 PA3 :RCLK 串型存储时钟输入 (上升沿有效) PA2 :SCK 串行移位时钟输入(上升沿有效) PA1 :SER 串型数据输入 发送数据时先发高位&#xff1…

【UnityShader入门精要】【总结记录】【第二章-1】

☀️博客主页:CSDN博客主页 💨本文由 萌萌的小木屋 原创,首发于 CSDN💢 🔥学习专栏推荐:面试汇总 ❗️游戏框架专栏推荐:游戏实用框架专栏 ⛅️点赞 👍 收藏 ⭐留言 📝&a…

使用 Access SQL 插入、更新和删除表格记录

参考链接 使用 Access SQL 插入、更新和删除表格记录 | Microsoft Learnhttps://learn.microsoft.com/zh-cn/office/vba/access/concepts/structured-query-language/insert-update-and-delete-records-from-a-table-using-access-sql 将记录插入表格 基本上有两种方法可以向…

client-go架构与原理介绍

个人博客 一、架构展示 client-go 库中的各种组件架构如下图所示: 二、目录结构 client-go 是用 Golang 语言编写的官方编程式交互客户端库,提供对 Kubernetes API server 服务的交互访问。 其源码目录结构如下: . ├── discovery …

再识openmmlab,用mmDeploy实现部署的前期需要了解一些内容

OpenMMLab 是一个用于学术研究和工业应用的开源算法体系,于2018年年中开始,由 MMLab(香港中文大学多媒体实验室)和商汤科技联合启动。 如果第一接触的话,还是建议参考官方环境配置教程:Windows 环境配置 -…

Midjourney万能高清咒语,真正的近看也美

明明我都拿人家的图垫图了,为什么质量还是很差? 明明别人都把咒语分享出来了,为什么质量还是很差? 今天我们就来解决这两个问题,看到就是缘分,点点手指来个小心心不过分吧,哈哈 什么你在怀疑我的…

Spring Boot + ElasticSearch实战之CRUD及多数据源配置

概述 本文记录工作中使用Spring Boot ElasticSearch的实战&#xff0c;Spring Boot版本&#xff1a;2.1.6.RELEASE。 基础 Spring Boot已是Java开发标配&#xff0c;使用SB提供的starter&#xff0c;简单高效。 配置 引入依赖&#xff1a; <dependency><groupI…

Rocketmq如何保证消息不丢失

如果想要保证消息不丢失就要知道&#xff0c;消息可能出现丢失得地方。 1.producer发送消息 2.Broker存储消息 3.Consumer消费消息 4.Broker主从切换 下面一共有9个维度可以保证消息不丢失。 目录 维度一&#xff1a;同步发送 维度二.异步发送 维度三.刷盘策略 维度四…

数据库期末复习(2)

关系数据库 图1 上图为思考题1的答案 \d student #查看完整性约束 模式和实例 关系的模式:关系有哪些、关系又什么类型、关系的约束时什么&#xff0c;一般来说关系的模式一般比较稳定&#xff0c;不会随着动态的变化而变化。 关系的实例:关系的实例一般随着变化的次数比较…

体验 InsCode AI,原来 AI 也扛不住互联网黑话

CSDN AI写作助手上线了&#xff01;InsCode AI 创作助手不仅能够帮助用户高效创作文章&#xff0c;而且能够作为对话式AI回答你想知道的问题。成倍提高生产力&#xff01;以下是我的体验分享 一、你平时会使用这类AI工具吗&#xff1f;你对这类型的工具有什么看法&#xff1f;…

RPC(2):RPC简介

1 RFC RFC(Request For Comments) 是由互联网工程任务组(IETF)发布的文件集。文件集中每个文件都有自己唯一编号&#xff0c;例如&#xff1a;rfc1831。目前RFC文件由互联网协会(Internet Society&#xff0c;ISOC)赞助发行。 RPC就收集到了rfc 1831中。可以通过下面网址查看…

微信小程序websocket使用protobuf,发送arraybuffer

❤️砥砺前行&#xff0c;不负余光&#xff0c;永远在路上❤️ 目录 前言一、如何在小程序websocket中使用 Protobuf 发送buffer二、使用过程遇到的坑&#xff08;版本问题&#xff09;1、需要注意下Protobuf版本 使用 protobufjs6.8.6最好&#xff0c;我在使用的时候安装7.多 …

1_7后端优化

后端优化是指将一段时间内相机所有关键帧的位姿、内参、每个点3维坐标作为参数进行优化&#xff0c;得到最优的内、外参&#xff1b;利用的方法主要是Bundle Adjustment。 所谓Bundle Adjustment可以理解为从任意特征点发射出来的几束光线&#xff0c;它们会在几个相机的成像平…

寄存器-汇编复习(2)

通过阅读本文小节内容&#xff0c;可以清楚的明白汇编承接的能力和机器语言&#xff0c;高级语言之间的表达关系。文中虽然讨论16位cpu&#xff0c;最新的64或以后的128理论都一样的&#xff0c;类推就好了。 继续将 通用寄存器-汇编复习(1)_luozhonghua2000的博客-CSDN博客 …

很多人打商标的主意,悄悄埋伏

很多人在打商标的主意&#xff0c;等着抢劫呢 等你的品牌结了果实&#xff0c;然后出手勒索 趣讲大白话&#xff1a;鬼子进村&#xff0c;打枪的不要 【趣讲信息科技183期】 **************************** 有些公司申请几千件商标 有公司一个月申请100件 春江水暖贼先知 有一条…

WSL2网络配置

WSL2越来越好用了&#xff0c;但是在windows下使用clash时&#xff0c;配置WSL2的网络很麻烦&#xff0c;通常使用设置环境变量export ALL_PROXY"http://127.0.0.1:8000"的方式有很大的弊端&#xff0c;例如pip和conda就不会走代理。 经过我亲身体验&#xff0c;最好…

基于小脑模型神经网络的轨迹跟踪研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…