我正在开发一个使用多线程的项目,该线程可以访问包含多个变量的共享结构。
为了避免并发问题,每当对共享结构中的一个变量进行写操作时,我都会使用互斥锁。现在我为每个变量使用不同的互斥锁,这样我就可以避免锁定线程来尝试写入未写入的变量,但我想知道是否有更好的方法可以避免这个问题。
另外,考虑到我的struct有uint16_t变量,是否有任何额外的措施来保证线程之间的数据一致性,因为内存对齐和多个变量存储在同一个数据寄存器中?
感谢。
答案 0 :(得分:1)
你没说什么语言。我打算假装它是C ++。
我为每个变量使用不同的互斥锁......
这听起来很可疑。
您的线程通过更新共享状态相互通信。正确使用互斥锁时,会做两件事:
如果一个线程可以通过写一个uint16_t
值来有意义地改变程序的状态,那么你不需要一个互斥量。只需将变量的类型更改为atomic<uint16_t>.
使其成为原子将确保其他线程可以看到更改。而且,您不必担心完整性。这是真实的:每个其他线程必须要么看旧值,要么看新值。没有其他可能性。
当情况更复杂时,您需要mutex
。假设您有三个变量:
int a, b, c;
并且,假设有一条规则,a+b+c
必须始终等于零。这样的规则称为不变。现在,线程无法合法地改变这三个变量中的一个。但是,如果它试图连续改变其中的两个,那么其他一些线程总是有可能在错误的时刻看到它们,并且它可能会看到它们处于不一致的状态(即,处于打破状态的状态)不变的。)
使变量atomic
无法解决问题。并且,为每个变量 制作单独的互斥锁将不会解决问题。您需要一个互斥锁,其目的是保护不变量。您需要更新a
,b
和/或c
的每个主题,以便在进行更改时锁定该互斥锁;并且你需要每个希望不变量为true的线程在看起来时锁定相同的互斥锁。