美文网首页
线程安全与可重入

线程安全与可重入

作者: 蟹蟹宁 | 来源:发表于2021-06-16 10:47 被阅读0次

线程安全

线程安全问题是由于线程之间存在共享变量(共享资源、临界资源、临界区)引起的。
由于CPU的调度,多个线程访问共享变量从而导致错误的结果,这个在OS、SQL的课程上都有详细的描述。
通常的解决方案就是加锁,以保证一个线程在访问临界区时,其他线程不得访问。

可重入函数

重入是指在调用一个函数且没有返回的情况下再次调用此函数,可重入函数是指一个函数发生重入时,不会导致结果的错误。一般情况下重入是不会发生的(网上很多人将多线程执行同一函数解释为重入,显然这种理解不合适,重入应该是指在单线程的情况下发生的),只有在发生中断、接收到信号的时候才会发生,因此可重入函数一般是对信号处理函数、中断处理函数的要求。

重入会导致结果错误的原因,同线程安全一样也是由于访问共享变量(全局变量,静态变量等)引起的。但是重入的难点在于无法通过加锁解决,因为一旦在加锁后发生重入,就会导致死锁(因为这是在单线程中的)。因此实现可重入的唯一方法就是避免使用任何共享变量。
在调用函数的时候,会在线程的栈中申请一个函数的栈帧,用于执行这个函数,栈帧中存放的是局部变量,因此如果函数中没有共享变量,函数的执行上下文是完全隔离的,这就等价于线程之间没有共享资源,是不会引发任何问题的。

notes

  • 显然如果函数中调用了不可重入的函数,如(malloc/fprintf),那么此函数一定是不可重入的
  • 如果在信号处理函数、中断处理函数中不得不使用共享变量(全局变量,静态变量等),那么就需要在执行时关中断、屏蔽信号,从而避免重入
  • 按照对重入的定义,递归函数也可以认为是一种重入。然而我们不会考虑递归函数的重入问题。递归函数可以完全等价于一个循环函数,他对于共享变量的访问是不存在上述问题的
写的仓促,不一定比百度的帖子写得好,2333

相关文章

  • 可重入与线程安全

    一个函数对多个线程来说是可重入的,则说这个函数是线程安全的,但是并不能说明对信号处理函数来说该函数也是可以重入的。...

  • 可重入与线程安全

    线程安全(thread safety)是指在多线程环境下,不同的线程在同一时刻能够安全访问临界区的能力,它可以让代...

  • 可重入与线程安全

    在多任务系统下,中断可能在任务执行的任何时间发生,同时也可能在任务执行过程中发生系统调度而将执行转向另一个线程,如...

  • 线程安全与可重入

    线程安全 线程安全问题是由于线程之间存在共享变量(共享资源、临界资源、临界区)引起的。由于CPU的调度,多个线程访...

  • Qt:可重入和线程安全

    线程安全函数也是可重入函数,但可重入不一定是线程安全。 A thread-safe function is alw...

  • Qt 可重入和线程安全

    可重入和线程安全 本文翻译自Qt官网:重入和线程安全[https://doc.qt.io/qt-5/threads...

  • 锁 - 可重入 vs 不可重入

    可重入锁 在多线程编程和信号处理过程中,经常会遇到可重入(reentrance)和线程安全(thread-safe...

  • 线程安全与可重入性

    线程安全与可重入性 线程安全 一个函数是线程安全指的是,当且仅当多个并发线程反复地调用这个函数时,它会一直产生正确...

  • 线程安全与可重入函数

    一,什么是线程安全? 当对一个复杂对象进行某种操作时,从操作开始到操作结束,被操作的对象往往会经历若干非法的中间状...

  • 线程安全

    线程安全 线程安全定义:线程间共享可变资源(内存)。 实现线程安全的方法:不共享资源。使用可重入函数,不对外部资源...

网友评论

      本文标题:线程安全与可重入

      本文链接:https://www.haomeiwen.com/subject/eruzeltx.html