【问题标题】:Using global variables in multiple threads在多个线程中使用全局变量
【发布时间】:2020-03-06 04:54:43
【问题描述】:

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

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

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

【问题讨论】:

  • 请记住,拥有多个读取器的某个变量通常不是问题。当您有多个 writers 时,通常会出现线程问题。如果您想正确实现它,请查看读写锁。那些取决于值的人应该锁定阅读,检查它,然后做任何事情。写入者必须获得写锁,这可能需要等待很短的时间才能获得该资源。
  • 您好先生..感谢您的快速回答。我有一个线程总是读取全局变量,而其他几个线程只在中断中写入全局变量。那么在这种情况下,是真的需要对读线程加锁还是只对写线程加锁就够了?
  • 如果您正在处理一个非常简单的值(如布尔值),通常只有编写器需要锁。对于需要时间写出来的更复杂的结构,例如操作是非原子,那么你需要更加小心。
  • 好的,先生。那么对于这种,互斥量和信号量哪个更合适呢?
  • @NaaiSekar 信号量具有全局可见性的特殊性。这允许您同步两个进程(不同的 PID)以及线程。由于您处于像您这样的多线程上下文中,因此互斥体就足够了。

标签: c multithreading


【解决方案1】:

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

while ( bDataPresent == false ) ...  

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

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

【讨论】:

  • 您好先生...感谢您的回答。但是我的 ADC 线程每次都会使用 SPI 从 ADC 获取数据,并且获取的数据需要通过布尔变量的值进行处理。所以在我的情况下,ADC 线程需要一直运行,它不应该等到条件成为现实。
  • @NaaiSekar 我不知道您打算如何使用布尔变量的详细信息,但我只是想警告您有关应用程序的性能方面。如果您可以展示您的线程之间的交互框架,我们可以为您提供帮助。
猜你喜欢
  • 2017-08-10
  • 2013-11-16
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多