linux - 多个线程定期更新全局变量,而第三个线程等待读取

标签 linux multithreading thread-safety pthreads posix

我有两个线程 A、B 定期更新两个全局传感器读取变量,它们执行相同的例程。第三个线程 C 将在更新后立即对这些值进行一些计算。我设置了一些条件变量,当 A 和 B 都更新了全局变量时,C 将立即读取。我担心线程 C 错过了一些传感器读数,因为它使用 while 循环的轮询是在新的 A、B 更新之后安排的。我不确定我的担心是否必要,因为我是 pthread 的新手。 我的开发环境是嵌入式linux板,目前正在学习pthread。 有没有比为每个全局变量设置两个条件变量更好的方法。

最佳答案

我会使用一个互斥量、一个条件变量和一个谓词整数生成计数器(只是一个初始化为零的常规整数)。逻辑是这样的:

要更新值:锁定互斥量。更新值。增加谓词整数。广播条件变量。释放互斥体。

读取当前值:锁定互斥量。复制谓词整数生成计数器的值。读取值。释放互斥体。

检查新值:锁定互斥量。根据您上次读取值时复制的值检查谓词整数。如果不同,则有一个新值。释放互斥体。

等待新值:锁定互斥量。当您上次读取值时谓词整数仍然保留它所持有的值,阻止条件变量释放互斥量。为您的下一次等待复制新的谓词整数。请注意新值。释放互斥体。

关于linux - 多个线程定期更新全局变量,而第三个线程等待读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10209937/

相关文章:

c++ - win32 程序是否应该始终是多线程的

c# - 如何将 winform 子窗体动态嵌入到主 winform 的选项卡控件中?

java - 线程安全的循环缓冲区?

java - commons.apache.org 中的 GenericObjectPool<T> 线程安全吗?

linux - 如何处理 shell 脚本中的错误

linux - 正确处理 libaio 回调中的上下文数据?

c++ - Linux/C++ 如何调试发布应用

ruby-on-rails - 如何使 ActiveRecord 成为线程安全的

php - 尝试安装 Horde 时出错

java - SAP Crystal Decisions 集成不适用于 Linux