在多线程环境中使用可重入函数有什么用?

时间:2018-03-28 13:01:57

标签: linux multithreading

多线程环境中可重入函数的用途是什么?

2 个答案:

答案 0 :(得分:0)

线程应仅使用re-entrant thread-safe函数来确保数据完整性和不可预测的行为。

  

_r结尾的所有系统调用和库函数都是   例如ctime_r

的重入或Mt安全函数

请参阅localtime()

的手册页
       ┌───────────────┬───────────────┬─────────────────────────────────┐
       │Interface      │ Attribute     │ Value                           │
       ├───────────────┼───────────────┼─────────────────────────────────┤
       │asctime()      │ Thread safety │ MT-Unsafe race:asctime locale   │
       ├───────────────┼───────────────┼─────────────────────────────────┤
       │asctime_r()    │ Thread safety │ MT-Safe locale                  │
       ├───────────────┼───────────────┼─────────────────────────────────┤
       │ctime()        │ Thread safety │ MT-Unsafe race:tmbuf            │
       │               │               │ race:asctime env locale         │
       ├───────────────┼───────────────┼─────────────────────────────────┤
       │ctime_r(),     │ Thread safety │ MT-Safe env locale              │
       │gmtime_r(),    │               │                                 │
       │localtime_r(), │               │                                 │
       │mktime()       │               │                                 │
       ├───────────────┼───────────────┼─────────────────────────────────┤
       │gmtime(),      │ Thread safety │ MT-Unsafe race:tmbuf env locale │
       │localtime()    │               │                                 │
       └───────────────┴───────────────┴─────────────────────────────────┘

答案 1 :(得分:0)

取决于"可重入功能的含义。"

对函数进行可重入调用意味着可以同时存在多个activation函数。有几种方式可能发生;函数可以调用自身(即,它是recursive函数),或者它可以由callback handler调用它自己使用的某个库例程,或者可以由{{3}调用它。 }}。上述任何一种情况都可能导致在同一interrupt handler上激活同一功能(即,可能存在可重入的呼叫)。

如果一个函数可以被多个线程调用,那么在不同的堆栈上可能会有多次激活该函数。

有时当我们说"可重入功能时,"我们正在讨论一个设计的函数来做正确的事情,即使存在多个活动调用。对于在多线程环境中调用的函数来说,这是一个理想的属性,在这种环境中,重入调用很容易实现。确保函数对于可重入调用是安全的最简单方法是确保它不会访问任何call stack或任何static variables