结构

时间:2018-05-02 18:33:38

标签: multithreading struct alignment mutex atomic

我正在开发一个使用多线程的项目,该线程可以访问包含多个变量的共享结构。

为了避免并发问题,每当对共享结构中的一个变量进行写操作时,我都会使用互斥锁。现在我为每个变量使用不同的互斥锁,这样我就可以避免锁定线程来尝试写入未写入的变量,但我想知道是否有更好的方法可以避免这个问题。

另外,考虑到我的struct有uint16_t变量,是否有任何额外的措施来保证线程之间的数据一致性,因为内存对齐和多个变量存储在同一个数据寄存器中?

感谢。

1 个答案:

答案 0 :(得分:1)

你没说什么语言。我打算假装它是C ++。

  

我为每个变量使用不同的互斥锁......

这听起来很可疑。

您的线程通过更新共享状态相互通信。正确使用互斥锁时,会做两件事:

  • 确保在线程A更新共享状态后,其他线程将能够看到更改的内容,并且
  • 确保其他线程查看更改,直到更改完成

如果一个线程可以通过写一个uint16_t值来有意义地改变程序的状态,那么你不需要一个互斥量。只需将变量的类型更改为atomic<uint16_t>.使其成为原子将确保其他线程可以看到更改。而且,您不必担心完整性。这是真实的:每个其他线程必须要么看旧值,要么看新值。没有其他可能性。

当情况更复杂时,您需要mutex。假设您有三个变量:

int a, b, c;

并且,假设有一条规则,a+b+c必须始终等于零。这样的规则称为不变。现在,线程无法合法地改变这三个变量中的一个。但是,如果它试图连续改变其中的两个,那么其他一些线程总是有可能在错误的时刻看到它们,并且它可能会看到它们处于不一致的状态(即,处于打破状态的状态)不变的。)

使变量atomic无法解决问题。并且,为每个变量 制作单独的互斥锁将不会解决问题。您需要一个互斥锁,其目的是保护不变量。您需要更新ab和/或c的每个主题,以便在进行更改时锁定该互斥锁;并且你需要每个希望不变量为true的线程在看起来时锁定相同的互斥锁。