3

目的

我正在编写一个小型库,其可移植性是最关心的问题。它被设计成只假设一个最符合 C90 (ISO/IEC 9899:1990) 的环境......仅此而已。该库提供的一组函数都对内部数据结构进行操作(读/写)。我已经考虑了其他一些设计替代方案,但对于图书馆试图实现的目标似乎没有其他可行的方法。

问题

是否有任何可移植的算法、技术或咒语可用于确保线程安全?我不关心使功能可重入。此外,如果算法/技术/咒语是可移植的,我不关心速度或(可能)浪费资源。理想情况下,我不想依赖任何库(例如 GNU Pth)或特定于系统的操作(例如原子测试和设置)。

我考虑过修改Lamport's bakery algorithm,但我不知道如何将其更改为在线程调用的函数内部工作,而不是在线程本身中工作。

任何帮助是极大的赞赏。

4

4 回答 4

1

如果没有操作系统/硬件支持,至少是原子 CAS,那么您将无能为力。不过,有一些可移植的库将各种平台抽象为一个通用接口。

http://www.gnu.org/software/pth/related.html

于 2009-08-02T19:49:28.610 回答
1

如今,几乎所有系统(甚至 Windows)都可以运行 libpthread。

于 2009-08-02T19:57:15.037 回答
0

函数要么不能是线程安全的,要么天生就是线程安全的,这取决于您如何看待它。线程/锁定天生就是特定于平台的。确实,由您的库的用户来处理线程问题。

于 2009-08-02T19:45:25.873 回答
0

Lamport 的面包店算法可能会起作用;不幸的是,它仍然存在实际问题。具体来说,许多 CPU 执行无序内存操作:即使您已将代码编译为完全正确的指令序列,CPU 在执行代码时可能会决定动态重新排序指令以获得更好的性能。解决这个问题的唯一方法是使用内存屏障,这是高度系统和 CPU 特定的。

您实际上只有两个选择:(1)保持您的库线程不安全并让您的用户在文档中意识到这一点,或者(2)使用特定于平台的互斥锁。选项 2 可以通过使用另一个库来简化,该库为各种平台实现互斥锁并为您提供统一的抽象接口。

于 2009-08-02T19:53:19.850 回答