c - 维基百科关于重入的错误吗?

标签 c multithreading thread-safety reentrancy

https://en.wikipedia.org/wiki/Reentrancy_(computing) (截至 2016 年 12 月 9 日)声明以下代码是可重入的,尽管修改了一个全局变量,因为 swap 保持不变:

int t;

void swap(int *x, int *y)
{
    int s;

    s = t; // save global variable
    t = *x;
    *x = *y;

    // hardware interrupt might invoke isr() here!
    *y = t;
    t = s; // restore global variable
}

但是,如果 swap 在任何其他地方被中断怎么办?根据术语的定义,这个函数是可重入的吗?

顺便说一句,这篇文章被引用为 SO 其他地方的来源——也许有人应该改进它。

最佳答案

要回答这个问题,有必要观察到“可重入”是一个具有多种公认含义的重载术语,其中一些含义从“延伸”到“公然不正确”。

我会说该函数是同步(但不是异步)可重入的,当然不是线程安全的。这在这里相当空洞,因为它不调用任何其他函数,但如果它调用一个回调函数,然后可以回调到这个函数,那将是有意义的。

如果正确使用 volatile 类型,该函数可能是异步可重入的(但仍然不是线程安全的)。

关于c - 维基百科关于重入的错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41082295/

相关文章:

c - select() 和 fcntl() 之间的区别

c++ - 安全地完成读取操作 (Boost.Asio)

multithreading - 具有 Jedis 连接工厂、Redis 独立配置和多线程的 Spring Redis 模板

java - 使用 ReentrantLock 实现阻塞并发

C到delphi转换

c - C中输入 double float

python - 在 for 循环中使用预加载数据的线程安全方式

java - 如果不再引用该对象,那么 "thread of the object"扩展线程会发生什么情况?

java - 当第一个线程锁定类时,第二个线程会发生什么

c - 我如何在进行分区作业时转换?