没有合适的资源?快使用搜索试试~ 我知道了~
首页LabWindows™CVI多线程编程优化指南
LabWindows™CVI多线程编程优化指南
需积分: 11 4 下载量 117 浏览量
更新于2024-07-15
收藏 302KB PDF 举报
LabWindows™/CVI中的多线程技术是由National Instruments公司发布的白皮书,它深入探讨了如何在该开发环境中有效地利用多线程技术来优化应用程序的性能。这篇文档针对的是四月18, 2011年发布,对于那些想要在多核或多处理器系统上构建高性能软件的开发者来说,提供了宝贵的指导。 首先,文章强调了多任务、多线程和多处理之间的区别。多任务允许操作系统在不同任务之间切换,给人一种并行运行的感觉,而多线程则是将应用程序分割成多个独立的执行单元,每个线程有自己的执行路径。多处理则是指一台计算机拥有多个处理器,能够并发执行多个线程。在多核处理器上,单线程应用可能无法充分利用硬件优势,因此多线程技术至关重要。 接下来,白皮书详细介绍了进行多线程编程的动机,包括提高程序响应速度、优化资源利用率和实现并发执行。选择合适的操作系统也是关键,因为并非所有系统都支持同等程度的多线程。在LabWindows/CVI中,开发者可以利用其提供的辅助线程功能来运行代码,这有助于减少主线程的负载,从而提高效率。 数据保护是多线程编程中的重要环节,白皮书讨论了如何确保数据安全,防止线程间的竞态条件和数据冲突。避免死锁,即两个或多个线程相互等待对方释放资源的情况,也是必须考虑的问题。此外,文档还涵盖了线程优先级设置、消息传递机制、使用线程局部变量(TLS)以及如何在独立线程中执行回调函数等实践技巧。 最后,白皮书中提到为线程指定特定处理器以充分利用多处理器系统,并推荐了一些额外的多线程技术资源,供读者进一步学习和探索。这份白皮书为LabWindows™/CVI用户提供了全面的多线程编程指南,帮助他们优化代码性能,适应现代硬件环境。
资源详情
资源推荐
LabWindows™/CVI中的多线程技术 - National Instruments
https://www.ni.com/white-paper/3663/zhs/[2018/3/16 18:03:47]
单线程程序中的线程被称为主线程。在用户告诉操作系统开始执行特定的程序时,操作系统将创建主线程。在多线程程序中,除了主线程
外,程序还通知操作系统创建其他的线程。这些线程被称为辅助线程。主线程和辅助线程的主要区别在于它们开始执行的位置。操作系统
从
main
或者
WinMain
函数开始执行主线程,而由开发人员来指定辅助线程开始执行的位置。
在典型的
LabWindows/CVI
多线程程序中,开发者使用主线程来创建、显示和运行用户界面,而使用辅助线程来进行其它时间要求严格的操
作,如数据采集等。
LabWindows/CVI
提供了两种在辅助进程中运行代码的高级机制。这两种机制是线程池(
thread pools
)和异步定时
器。线程池适合于执行若干次的或者一个循环内执行的任务。而异步定时器适合于定期进行的任务。
使用线程池
为了使用
LabWindows/CVI
的线程池在辅助线程中执行代码,需要调用
Utility Library
中的
CmtScheduleThreadPoolFunction
函数。将需要在
辅助线程中运行的函数名称传递进来。线程池将这个函数调度到某个线程中执行。根据配置情况和当前的状态,线程池可能会创建新的线程
来执行这个函数、也可能会使用已存在的空闲进程执行函数或者会等待一个活跃的线程变为空闲然后使用该线程执行预定的函数。传递
给
CmtScheduleThreadPoolFunction
的函数被称为线程函数。线程池中的线程函数可以选择任意的名称,但是必须遵循以下原型:
int CVICALLBACK ThreadFunction (void *functionData);
下面的代码显示了如何使用
CmtScheduleThreadPoolFunction
函数在辅助进程中执行一个数据采集的线程。
int CVICALLBACK DataAcqThreadFunction (void *functionData);
int main(int argc, char *argv[])
{
int panelHandle;
int functionId;
if (InitCVIRTE (0, argv, 0) == 0)
return -1; /* out of memory */
if ((panelHandle = LoadPanel(0, "DAQDisplay.uir", PANEL)) < 0)
return -1;
DisplayPanel (panelHandle);
CmtScheduleThreadPoolFunction (DEFAULT_THREAD_POOL_HANDLE, DataAcqThreadFunction, NULL, &functionId);
RunUserInterface ();
DiscardPanel (panelHandle);
CmtWaitForThreadPoolFunctionCompletion (DEFAULT_THREAD_POOL_HANDLE, functionId, 0);
return 0;
}
int CVICALLBACK DataAcqThreadFunction (void *functionData)
{
while (!quit) {
Acquire(. . .);
Analyze(. . .);
}
return 0;
}
在前面的代码中,主线程调用了
CmtScheduleThreadPoolFunction
函数,使线程池创建了一个新的线程来运行
DataAcqThreadFunction
线程
函数。主线程从
CmtScheduleThreadPoolFunction
函数返回,而无须等待
DataAcqThreadFunction
函数完成。在辅助线程中
的
DataAcqThreadFunction
函数与主线程中的调用是同时执行的。
CmtScheduleThreadPoolFunction
函数的第一个参数表示用于进行函数调度的线程池。
LabWindows/CVI
的
Utility Library
中包含了内建的默
认线程池。传递常数
DEFAULT_THREAD_POOL_HANDLE
表示用户希望使用默认的线程池。但是用户不能对默认线程池的行为进行自定
义。用户可以调用
CmtNewThreadPool
函数来创建自定义的线程池。
CmtNewThreadPool
函数返回一个线程池句柄,这个句柄将作为第一
个参数传递给
CmtScheduleThreadPoolFunction
函数。程序员需要调用
CmtDiscardThreadPool
函数来释放由
CmtNewThreadPool
函数创建
的线程池资源。
CmtScheduleThreadPoolFunction
函数中的最后一个参数返回一个标识符,用于在后面的函数调用中引用被调度的函数。调
用
CmtWaitForThreadPoolFunctionCompletion
函数使得主线程等待线程池函数结束后再退出。如果主线程在辅助线程完成之前退出,那么
可能会造成辅助线程不能正确地清理分配到的资源。这些辅助线程使用的库也不会被正确的释放掉。
使用异步定时器
剩余14页未读,继续阅读
武汉缔万科技-陈垚
- 粉丝: 7
- 资源: 48
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 计算机人脸表情动画技术发展综述
- 关系数据库的关键字搜索技术综述:模型、架构与未来趋势
- 迭代自适应逆滤波在语音情感识别中的应用
- 概念知识树在旅游领域智能分析中的应用
- 构建is-a层次与OWL本体集成:理论与算法
- 基于语义元的相似度计算方法研究:改进与有效性验证
- 网格梯度多密度聚类算法:去噪与高效聚类
- 网格服务工作流动态调度算法PGSWA研究
- 突发事件连锁反应网络模型与应急预警分析
- BA网络上的病毒营销与网站推广仿真研究
- 离散HSMM故障预测模型:有效提升系统状态预测
- 煤矿安全评价:信息融合与可拓理论的应用
- 多维度Petri网工作流模型MD_WFN:统一建模与应用研究
- 面向过程追踪的知识安全描述方法
- 基于收益的软件过程资源调度优化策略
- 多核环境下基于数据流Java的Web服务器优化实现提升性能
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功