我有两个线程A,B定期更新两个全局传感器读取variables,它们执行相同的例程。 第三个线程C会在更新后立即对这些值进行一些计算。 我设置了一些条件variables,当A和B都更新全局variables时,C将立即读取。 我担心线程C错过了一些传感器读数,因为它在循环的轮询安排在新的A,B更新后被使用。 我不确定我的担忧是否有必要,因为我是一个新手。 我的开发环境是embedded式Linux板,目前我正在学习pthread。 有没有比为每个全局variables设置两个条件variables更好的方法。
我将使用一个互斥体,一个条件变量和一个谓词整数生成计数器(只是一个正则整数初始化为零)。 逻辑工作是这样的:
要更新值:锁定互斥锁。 更新值。 递增谓词整数。 广播条件变量。 释放互斥锁。
要读取当前值:锁定互斥锁。 复制谓词整数生成计数器的值。 阅读价值。 释放互斥锁。
要检查新值:锁定互斥锁。 根据上次读取值时复制的值检查谓词整数。 如果不一样,那就有了新的价值。 释放互斥锁。
要等待新值:锁定互斥锁。 虽然谓词整数仍然保存上次读取值时所保存的值,但会阻止释放互斥量的条件变量。 复制新的谓词整数为您的下一个等待。 注意新的价值。 释放互斥锁。
你的另一个选择是一个普通的互斥体。
pthread_mutex_t lockX = PTHREAD_MUTEX_INITIALIZER; [...] pthread_mutex_lock(lockX); // do things with shared variable pthread_mutex_unlock(lockX);
这适用于读写,因为即使只有一个int,线程A也可能读取一半的值,然后线程B写入相同的变量,线程B继续读取另一半,导致“值”从来没有存在过。
你不必使用线程的全局变量,顺便说一句。 你可以传递一个结构指针给它的任何东西到线程函数。