gpt4 book ai didi

c++ - 数据结构的线程安全,在哪里添加同步原语?

转载 作者:可可西里 更新时间:2023-11-01 18:27:33 24 4
gpt4 key购买 nike

这是一个困扰我一段时间的设计问题。这真的很简单,当您提供数据结构库时,您是在线程安全原语中构建还是只提供构造并让使用它的系统决定如何实现实际操作。

一个简单的例子,一个支持生产者、消费者模型的循环缓冲区。 2个方法,Get和Write,各自更新一个全局变量填充计数。现在,您是只提供要锁定的互斥体并让使用缓冲区的代码获取互斥体,还是在内部进行锁定并提供开箱即用的互斥。

STL 似乎采用了在外部进行的方法,但出于性能原因,您会想要提供更细粒度的锁定。

想法?

最佳答案

恕我直言,这场讨论没有明显的赢家。董事会的两边各有利弊:

将同步作为 API 的一部分(在模块内):

  • 确保调用者不必花太多时间考虑同步
  • 确保调用者不会在同步时出错(因为在没有内置同步结构支持的语言中同步很容易出错)
  • 您可以进行更细粒度的锁定并优化您的库

让调用者同步

  • 给来电者更多的控制权
  • 在单线程程序中,调用者不会花时间锁定/解锁

您可以根据情况做出决定:

  • 如果它是最有可能在多线程情况下使用的库,则提供内置锁定
  • 如果锁定实现起来非常乏味(比如线程安全队列的每个节点锁定),那么将其作为库的一部分提供
  • 考虑提供 2 个版本的图书馆 - 锁定和解锁。在 C++ 中使用模板来提供良好的语法以及 ThreadSafe 接口(interface)等并发模式
  • 保持一致!如果您在库中提供一组模块,请确保线程安全模块与非线程安全模块的语法一致。这是我对 Java Swing 的不满,因为它们不一致。该库的某些部分是线程安全的,而其他部分则不是。

希望这对您有所帮助!

关于c++ - 数据结构的线程安全,在哪里添加同步原语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9132101/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com