【发布时间】:2021-09-28 06:02:45
【问题描述】:
我正在开发新库,以便将我现有的大量应用程序移植到通用代码中,并与他人分享我的经验 (FOSS)。
库实现本身根本不使用任何全局/静态变量。相反,它提供了不透明的数据类型和相应的访问器函数来对该数据执行不同的任务。
未来将使用该库的应用程序可能(并且将会)是多线程的(例如具有实时处理功能的 GUI 应用程序),因此出现了关于线程安全的问题。至于我有两种实现方式:
- 升级当前库代码并实现一些线程感知的东西,例如,通过使用 PThreads API。对我来说,它看起来像这样:为每个可能可变的对象添加一些互斥体并在访问器例程中尊重它们 - 设置器、获取器、重新初始化器等。
- 以不会发生线程特定问题(例如死锁、并发等)的方式编写客户端程序 - 通过在最终用户应用程序中使用相同的 PThreads,而不是在库中。
乍一看,第一种方法更加通用和灵活 - 我的库的最终用户不应该担心使用多线程破坏事物:库的内部将在互斥锁和其他同步的帮助下负责访问关键部分机制。可能是我缺乏一些经验,但我不记得使用这种方法的任何项目。可能是我没有深入挖掘...
第二种方法看起来更简单(对于我作为库开发人员而言),因为我将所有线程同步任务卸载给最终用户,而无需自己处理 PThreads(或类似的东西)。
我的问题是:纯粹在库本身(方法 1)中处理线程安全问题是否被认为是好的做法?将所有线程同步任务卸载给最终用户会导致在使用库的同时减轻其开发负担吗?
编辑:符合 SO 风格
【问题讨论】:
-
基于意见和背景,VTC
-
第一种方法强制用户包含 pthread,即使他们不需要它。
-
这是一个非常广泛的话题,虽然您的问题在总体方案中是有效的,但在 SO 中却是题外话。以下是一些自以为是的想法: 最简单的方法是确保一切都是可重入的;这意味着您要么在堆栈框架上维护单独的结构,要么对任何堆写锁使用原子防护。您不需要或担心是否有人在使用 pthreads 或其他东西。 (除非你的库自己做线程)。
-
作为一个狂热的 C 程序员,我鼓励你看看 Rust ;) 这是 HYPER 固执己见,但它有效。
标签: c multithreading thread-safety