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

时间:2012-04-18 13:02:22

标签: linux multithreading thread-safety pthreads posix

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

2 个答案:

答案 0 :(得分:1)

我会使用一个互斥锁,一个条件变量和一个谓词整数生成计数器(只是初始化为零的常规整数)。逻辑的工作原理如下:

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

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

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

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

答案 1 :(得分:0)

您的其他选项是普通的互斥锁。

pthread_mutex_t lockX = PTHREAD_MUTEX_INITIALIZER;

[...]

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

这适用于读写,因为即使使用单个int,线程A也可以读取 half 一个值,然后线程B写入同一个变量,并且线程B继续读取另一半,导致从未存在的“价值”。

你没有 使用带有线程的全局变量BTW。您可以将包含其中任何内容的结构指针传递给线程函数。