<强>目的

我正在编写一个小型库,其中可移植性是最受关注的问题。它被设计为仅假设一个符合大多数要求的C90(ISO / IEC 9899:1990)环境......仅此而已。库提供的一组功能都在内部数据结构上运行(读/写)。我已经考虑了其他一些设计备选方案,但是对于该库来说,似乎没有其他任何可行的方法试图实现

<强>问题

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

我考虑修改 Lamport的面包店算法,但我不知道如何改变它在线程调用的函数内部工作,而不是在线程本身工作。

非常感谢任何帮助。

有帮助吗?

解决方案

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

这里你真的只有两个选择:(1)保持你的库线程不安全并让你的用户在文档中知道它,或者(2)使用特定于平台的互斥锁。通过使用另一个为各种平台实现互斥的库,可以使选项2变得更容易,并为您提供统一的抽象接口。

其他提示

如果没有OS /硬件支持,至少是一个原子CAS,那么你无能为力。 可移植库,它们将各种平台抽象为一个通用接口。

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

这几天几乎所有系统(甚至是Windows)都可以运行libpthread。

函数要么不是线程安全的,要么天生就是线程安全的,具体取决于你想看它的方式。并且线程/锁定是天生特定于平台的。实际上,由图书馆的用户来处理线程问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top