加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – C可重入函数

发布时间:2020-12-16 10:26:14 所属栏目:百科 来源:网络整理
导读:我一直在研究和纠正重入/线程安全,主要是因为我正在实施的一些概念.我提出了一个理论,并且只是想知道是否有任何有重新进入问题经验的人可以提供他们对这个概念的见解和知识…… 考虑到主要问题在于通过多个线程调用函数时(并且在解释这些问题时使用的许多示
我一直在研究和纠正重入/线程安全,主要是因为我正在实施的一些概念.我提出了一个理论,并且只是想知道是否有任何有重新进入问题经验的人可以提供他们对这个概念的见解和知识……

考虑到主要问题在于通过多个线程调用函数时(并且在解释这些问题时使用的许多示例往往来自在已经执行时调用该方法的信号中断),而该方法使用本地静态和/或全局数据导致多次调用试图改变和/或操纵有问题的数据.话虽这么说,创建可重入函数的主要建议是确保不使用这种类型的数据或使用它时具有保护对所述数据的读/写访问的互斥和/或信号量锁定机制.现在锁会生成线程安全函数,但不保证重入函数.现在我知道以下概念违背了我已经阅读的上述建议,但我很想知道直接反对上述建议能否提供一种确保重入功能的富有成效的方法?

int some_func(int someIndexParam)
{
    static bool isActive = false; // start it off as false,no other instances calling it immediately
    if (isActive)
        return ALREADY_RUNNING;
    isActive = true;

    // DO ALL YOUR WORK HERE

    isActive = false;
    return SUCCESS;
}

在上面这个概念中,我使用了一个大的“no-nos”来实际确定它是否可以安全继续.现在我知道这可能仍然可能导致竞争条件,在这种罕见的情况下,这种函数几乎背对背地调用同一函数的另一个调用,因为isActive值可能无法及时更新停止继续进行第二次调用,但我认为这是一个小因素,除非该函数经常被大量线程调用,但我很想听到其他人对这种处理重入问题的方法的看法?

谢谢

解决方法

TL; DR:出于某种原因,这是一个很大的禁忌.

事实上有多个原因:

>编译器可以自由地重新排列事物,只要保留语言指定的所谓“可观察行为”即可.语言规范允许它完全删除isActive分配.好的编译器会这样做!
>不,它不会“潜在地导致种族争议”,这是一种竞争条件.没有“潜在”,也没有“领先”.请记住,计算机每秒能够执行数十亿次操作(甚至是智能手机),成功的程序通常运行时间不止一次,通常在多台计算机上运行.因此,即使某些事件的概率看起来非常遥远,例如曾经万亿次,但几乎可以肯定它会发生,并且会比你想象的更早发生.

这个代码对于多线程(使用互斥或??其他适当的同步原语)或重入信号处理(使用正确的sig原子类型,并使用正确的单值取消屏蔽等)是错误的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读