C中的重入和重入?

Kor*_*gay 6 c concurrency reentrancy

我正在读一本名为Linux System Programming的书.引用本书:

那么系统调用和其他库函数呢?如果您的进程正在写入文件或分配内存,并且信号处理程序写入同一文件或调用malloc(),该怎么办?有些功能显然不可重入.如果一个程序正在执行一个非重入函数并且信号发生并且信号处理程序然后调用相同的非重合函数,则可能发生混乱.

但接下来会:

保证重入函数

保证可以安全重入的功能用于信号

一些功能在这里..

写()

一些功能在这里..

我很困惑,是可以write()折返的,还是没有?因为我认为它与声明冲突:

如果您的进程正在写入文件,该怎么办?

Sou*_*osh 6

只是为了补充@Joachim Pileborg先生在他的回答中提到的内容,根据Reentrancywiki条目,函数重入的基本规则是:

  1. 可重入代码可能不包含任何静态(或全局)非常量数据.
  2. 可重入代码可能不会修改自己的代码.
  3. 可重入代码可能不会调用非重入计算机程序或例程.

详细说明,该函数(如果是可重入的)不会对其自身的实现(引入它自己使用的内部数据结构)产生任何问题,无论是从不同的上下文调用.

提供给函数的参数(例如文件描述符)不会影响它的重入.

因此,对于write(),函数本身是Reentrant,但是如果从不同的线程调用相同的文件描述符,则显然会产生错误的结果.再次,这并不意味着,在重入write()走了.它是可重入的,但不是线程安全的,这两个是不同的方面.


Som*_*ude 5

如果你可以从不同的上下文调用一个函数而不打扰来自另一个上下文的另一个调用,那么重入有更多的事情要做.

strtok功能为例.它通常包含一个static局部变量,用于跟踪您要标记的字符串中的下一个位置.由于局部static变量在函数的所有调用之间共享,因此从两个不同的上下文调用函数将导致问题.

write系统调用,而另一方面,有它调用之间存储没有这样的内部数据,这使得它安全地从不同的上下文中调用.


重要的是要注意重入与线程安全不同.以write函数为例,因为它是可重入的,你可以使用不同的文件从不同的线程调用它,而不必担心内部数据会被破坏.但是,它不是线程安全的.使用相同的文件描述符不同的线程中调用它导致问题.

  • 但重入也意味着线程安全吗?我想不是!(我认为这很重要) (3认同)