对于高性能多线程系统,是否有一种确定的方法/方法来确定仅使用比较和交换a.k.a可以完成哪些并发逻辑。原子操作,什么必须使用锁,检波器和/或屏障?
我的系统总是涉及很多并发和多线程问题。有些方法很简单,因为我们可以计算出是否需要快速地使用简单的锁;但是对于一些复杂的问题,或者将性能推向极致的试验,我发现我没有一致的确定性方法来判断一个问题是否可以使用CAS来解决。例如:
粗略地说,如果一段逻辑可以分成几个相依状态,每一个都只需要CAS,那么这种逻辑只能由CAS来解决。但将此应用于实际问题似乎要复杂得多,我确实感到缺乏一个很好的方法来划分和确定这种逻辑划分是否可行。
请与我分享你的经验或任何我不知道的方法。
发布于 2014-05-16 00:55:27
这里是我的外行经验,在使用了很多年的原子。
共存.使用atomics -所有必须原子更改的数据都必须是连续的.因此,使用atomics很难实现双链接列表,因为您必须同时更新不同节点上的指针。一个链接列表是微不足道的。
小。小的意思是小到系统上允许的最大的原子操作。要使用atomics更新结构中的50个字段,您可以创建新的结构,然后原子地交换指向它的指针。
您不需要任何花哨的东西。在处理单个链接列表时,只能从列表的前面添加和删除项目。如果您可以使用哈希表、单个链接列表、跳过列表或数组来完成此操作,则可以使用atomics。Atomics非常适合构建结构,然后原子地交换指向该结构的指针。
您需要细粒度的锁定。例如,使用和原子哈希表“锁定”在桶级而不是列表级别。我想你每个桶可以有一个互斥物。
速度。变体是可怕的slow...compared原子。每次调用malloc时,编写一个锁定互斥锁的内存分配器会很糟糕。大约3年前,我对互斥物和原子进行了基准测试,并提出了40倍的减速。
Mix和match! --我在一些地方使用Mutexes,在这些地方,atomics会让屁股非常痛苦,而且会让人迷惑。我试图将这些情况限制在执行不多的代码上,这样我就不会为性能问题付出代价。
所有这些限制,我说,我很容易使用原子在所有热点,只需要回到互斥很少。
https://stackoverflow.com/questions/20322798
复制相似问题