c - 在多个线程中使用全局变量
问题描述
我们正在使用 Colibri iMX7D 进行产品开发。我们的应用程序在带有 GTK+3 的嵌入式 Linux 上运行。
在我们的应用程序中,将始终运行一个线程以从 ADC 获取数据,并且在我从 GPIO 收到中断之前不会处理数据。所以,为了实现这一点,我有一个全局布尔变量。在中断线程(libsoc)中,我将布尔值设置为真。在 ADC 线程中,如果该变量为真,我将处理数据。当另一个 GPIO 中断发生时,我会在中断线程中将变量设置为 false。
经过大量谷歌搜索,我发现在多个线程中使用共享变量并不好,并发现了互斥锁和信号量等概念。这有点令人困惑,因为两者看起来很相似,而且我不确定我的应用程序要使用什么。欢迎提出实现这一点的建议或指导。
解决方案
除了simultaneous
读写访问期间的数据一致性问题外,您所呈现的架构在性能方面还有一个主要缺点。事实上,使用布尔变量的事实,这迫使你可能在你的 ADC 线程中循环,看起来像这样:
while ( bDataPresent == false ) ...
您应该知道,在这种情况下,您ADC thread
正在永久执行,因此,它会消耗资源:CPU
, memory
, ...
当您使用semaphore
(或其他同步机制)时情况并非如此,因为当线程在信号量调用上被阻塞时,它不会消耗那么多资源。
推荐阅读
- python - 如何遍历两个列表并进行匹配?
- android - 我的 oppo reno 4 手机上有一个带有统一标志的匿名应用程序?
- c - Makefile:没有这样的文件或目录'-c'
- asp.net - 从 ASP.NET Core 控制器读取 docker-compose 环境变量
- session - 没有 Cookie / 没有 IP 跟踪访客
- java - sun.security.ssl.Alert.createSSLException 使用 apache commons library 进行 post call
- javascript - ajax 调用会减慢前端的速度吗?
- javascript - 用于 YAML 前端的 Javascript 正则表达式
- python - 启动器中的致命错误:无法使用“”创建进程
- html - 根据该图像坐标将图像放在 VueJS/Vuetify 中的另一个上