C中的可移植线程安全?

C中的可移植线程安全?,c,algorithm,multithreading,thread-safety,portability,C,Algorithm,Multithreading,Thread Safety,Portability,目的 我正在写一个小型的库,其中可移植性是最大的问题。它被设计为仅假设一个基本符合C90(ISO/IEC 9899:1990)的环境。。。没别的了。库提供的一组函数都在内部数据结构上运行(读/写)。我考虑过一些其他的设计方案,但对于这个库来说,似乎没有其他可行的方案 问题 是否有任何可移植的算法、技术或咒语可用于确保线程安全?我不关心让这些功能重新进入。此外,如果算法/技术/咒语是可移植的,我不关心速度或(可能)浪费资源。理想情况下,我不想依赖任何库(如GNUPTH)或系统特定的操作(如原子测试

目的

我正在写一个小型的库,其中可移植性是最大的问题。它被设计为仅假设一个基本符合C90(ISO/IEC 9899:1990)的环境。。。没别的了。库提供的一组函数都在内部数据结构上运行(读/写)。我考虑过一些其他的设计方案,但对于这个库来说,似乎没有其他可行的方案

问题

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

我考虑过修改,但我不知道如何修改它,使其在线程调用的函数中工作,而不是在线程本身中工作


非常感谢您的帮助。

函数要么不是线程安全的,要么是天生的线程安全的,这取决于您希望如何看待它。而且线程/锁定与生俱来是特定于平台的。实际上,由库的用户来处理线程问题。

如果没有操作系统/硬件支持,至少是一个原子CAS,您就无法做到任何实用的事情。不过,有一些可移植库可以将各种平台抽象为一个公共接口


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


在这里,您实际上只有两种选择:(1)保持库线程不安全,并在文档中让用户意识到这一点,或者(2)使用特定于平台的互斥。通过使用另一个为多种平台实现互斥并为您提供统一抽象界面的库,选项2可以变得更容易。

现在几乎所有系统(甚至Windows)都可以运行libpthread。

在哪里可以获得有关libpthread的更多信息?一个简单的谷歌搜索似乎发现了一堆垃圾;请看,pthreads在任何*nix上都是本机可用的,windows实现在这里的authoritive dp文档中:如果您这样做,就很容易向库的用户公开pthreads,这可能并不总是可取的。我现在正在考虑抽象锁和解锁过程,并使用一些预处理器宏来支持各种不同的线程库。这可能是最好的方法。我只提供互斥体(void**);互斥锁(void*);和互斥解锁(void*);这是我的项目使用的。填充mutex_posix.c和mutex_win32.c中的实现,这些实现自然是经过有条件编译的,只要有一个本地实现可用(如果平台支持线程,则几乎总是如此),就可以为像mutex这样简单的东西提供不同的实现兰波特的算法也需要一致的内存缓存吗?我还没有看到证明,但在我看来,当前线程依赖于在线程j向其写入真值和线程j向其写入假值之间的时间段内,将每个输入的[j]视为真值。因此,即使可以处理写入顺序,该代码也可能无法在多核ARM机器上运行。同样,需要内存屏障或原子CA。