4

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

4

2 回答 2

1

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

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

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

检查新值:锁定互斥锁。检查谓词整数与您上次读取值时复制的值。如果不同,就有新的价值。释放互斥锁。

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

于 2012-04-18T13:42:03.257 回答
0

您的另一个选择是普通互斥锁。

pthread_mutex_t lockX = PTHREAD_MUTEX_INITIALIZER;

[...]

pthread_mutex_lock(lockX);
// do things with shared variable
pthread_mutex_unlock(lockX);

这适用于读取和写入,因为即使使用单个 int,线程 A 也可能读取一半值,然后线程 B 写入同一个变量,线程 B 继续读取另一半,从而产生“值”从未存在过。

顺便说一句,您不必全局变量与线程一起使用。您可以将包含任何内容的结构指针传递给线程函数。

于 2012-04-18T13:14:51.353 回答