Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C、C+中重入代码的推荐做法+;_C++_C_Reentrancy - Fatal编程技术网

C++ C、C+中重入代码的推荐做法+;

C++ C、C+中重入代码的推荐做法+;,c++,c,reentrancy,C++,C,Reentrancy,在编写可重入代码时,我正在经历一次关于推荐实践的讨论 本主题还涉及哪些其他参考资料和资源 什么样的工具可以用来检查这些问题?没有。写不重入的代码通常比重入更困难。只要遵循这些简单的指导原则,不要做任何太古怪的事情,你就会没事的 非重入代码通常是针对高性能问题编写的。指南就足够了 对于重新输入代码,我个人的经验法则只有2条: 仅接受传递值参数,仅使用作为函数中的参数传递的值 如果我需要使用任何全局参数或指针(为了性能或存储),请使用互斥或信号量来控制对它的访问 一定要使用局部变量 不要使用静态局

在编写可重入代码时,我正在经历一次关于推荐实践的讨论

本主题还涉及哪些其他参考资料和资源


什么样的工具可以用来检查这些问题?

没有。写不重入的代码通常比重入更困难。只要遵循这些简单的指导原则,不要做任何太古怪的事情,你就会没事的


非重入代码通常是针对高性能问题编写的。

指南就足够了

对于重新输入代码,我个人的经验法则只有2条:

  • 仅接受传递值参数,仅使用作为函数中的参数传递的值

  • 如果我需要使用任何全局参数或指针(为了性能或存储),请使用互斥或信号量来控制对它的访问

    • 一定要使用局部变量
    • 不要使用静态局部变量或全局变量,即使TLS也不能帮助您实现递归/重入
    • 在执行回调之前恢复所有不变量
    • 在执行回调时不要持有锁。如果你绝对必须(我仍然会去寻找一种方法来避免它),那么确保你知道如果你试图重新进入已经持有它的线程上的锁会发生什么。至少您必须对此进行测试,否则根据锁的不同,您将得到死锁或损坏的不变量(即损坏)
  • 可重入函数不能以非原子方式使用变量,除非它们是 存储在调用任务的堆栈上,或是该任务的私有变量
  • 可重入函数不能调用其他不可重入的函数
  • 可重入函数不能以非原子方式使用硬件
  • 参考:第462页[使用
    RENESAS RX62N微控制器][James M.Conrad]

    如果需要复杂类型,请尽可能使其不可变HI fmark:您能进一步解释吗?或者给我指一些和这句话有关的东西?不!重新进入!=穿线。互斥量和信号量将使可重入代码死锁,或者默默地无法完成其工作并导致数据损坏。假设我有两个函数来调整FPU控制字(一个需要启用异常,另一个需要禁用异常)。这两个函数在进入时保存FPU控制字的当前状态,在退出时恢复该状态。现在,这两个函数可以相互递归一整天,您也可以从信号处理程序安全地使用它们——它们是可重入的。但是它们绝对不是线程安全的。@Chethan:如果您对标准术语使用了错误的定义,您可以使任何语句都正确。但也毫无意义。那本指南几乎有你需要知道的一切。这不是一件很微妙的事情。不要使用未在函数调用中传递的数据,不要在函数中存储任何状态。该指南中有许多错误,从实际上是多线程的可重入性定义(尽管信号处理示例是真正的可重入性)到错误建议(互斥体…hello死锁),再到简单的错误(
    SIGSSUSPEND)(&zeromask)
    。您刚刚允许处理因某种原因而被调用者禁用的中断,请尝试
    sigsuspend(&oldmask)
    )。