【发布时间】:2020-03-06 04:54:43
【问题描述】:
我们正在使用 Colibri iMX7D 进行产品开发。我们的应用程序在带有 GTK+3 的嵌入式 Linux 上运行。
在我们的应用程序中,将始终运行一个线程以从 ADC 获取数据,并且在我从 GPIO 收到中断之前不会处理数据。所以,为了实现这一点,我有一个全局布尔变量。在中断线程(libsoc)中,我将布尔值设置为真。在 ADC 线程中,如果该变量为真,我将处理数据。当另一个GPIO中断发生时,我会在中断线程中将该变量设置为false。
经过大量谷歌搜索,我发现在多个线程中使用共享变量并不好,并发现了互斥锁和信号量等概念。这有点令人困惑,因为两者看起来很相似,而且我不确定我的应用程序要使用什么。欢迎提出实现这一点的建议或指导。
【问题讨论】:
-
请记住,拥有多个读取器的某个变量通常不是问题。当您有多个 writers 时,通常会出现线程问题。如果您想正确实现它,请查看读写锁。那些取决于值的人应该锁定阅读,检查它,然后做任何事情。写入者必须获得写锁,这可能需要等待很短的时间才能获得该资源。
-
您好先生..感谢您的快速回答。我有一个线程总是读取全局变量,而其他几个线程只在中断中写入全局变量。那么在这种情况下,是真的需要对读线程加锁还是只对写线程加锁就够了?
-
如果您正在处理一个非常简单的值(如布尔值),通常只有编写器需要锁。对于需要时间写出来的更复杂的结构,例如操作是非原子,那么你需要更加小心。
-
好的,先生。那么对于这种,互斥量和信号量哪个更合适呢?
-
@NaaiSekar 信号量具有全局可见性的特殊性。这允许您同步两个进程(不同的 PID)以及线程。由于您处于像您这样的多线程上下文中,因此互斥体就足够了。
标签: c multithreading