首页 > 解决方案 > 在多个线程中使用全局变量

问题描述

我们正在使用 Colibri iMX7D 进行产品开发。我们的应用程序在带有 GTK+3 的嵌入式 Linux 上运行。

在我们的应用程序中,将始终运行一个线程以从 ADC 获取数据,并且在我从 GPIO 收到中断之前不会处理数据。所以,为了实现这一点,我有一个全局布尔变量。在中断线程(libsoc)中,我将布尔值设置为真。在 ADC 线程中,如果该变量为真,我将处理数据。当另一个 GPIO 中断发生时,我会在中断线程中将变量设置为 false。

经过大量谷歌搜索,我发现在多个线程中使用共享变量并不好,并发现了互斥锁和信号量等概念。这有点令人困惑,因为两者看起来很相似,而且我不确定我的应用程序要使用什么。欢迎提出实现这一点的建议或指导。

标签: cmultithreading

解决方案


除了simultaneous读写访问期间的数据一致性问题外,您所呈现的架构在性能方面还有一个主要缺点。事实上,使用布尔变量的事实,这迫使你可能在你的 ADC 线程中循环,看起来像这样:

while ( bDataPresent == false ) ...  

您应该知道,在这种情况下,您ADC thread正在永久执行,因此,它会消耗资源:CPU, memory, ...

当您使用semaphore(或其他同步机制)时情况并非如此,因为当线程在信号量调用上被阻塞时,它不会消耗那么多资源。


推荐阅读