多线程

编译配置

编译newlib时,需要增加配置 --enable-newlib-multithread 开启多线程的支持,默认是开启的。

_reent结构体

Newlib中的头文件 reent.h 中,定义了结构体struct _reent ,用于支持多线程:

  • 默认情况下,Newlib定义了一个全局的结构体变量 impure_data , 此结构体定义在 newlib/libc/reent/impure.c ,并使用宏 _REENT 表示它;
  • struct _reent 定义了一些C标准的变量,例如 errnostdinstdoutstderr 等;
  • 为了支持多线程访问各自的 errnostdinstdoutstderr 等,需要在 线程对象结构体中增加结构体 struct _reent 的成员;
  • 由于 struct _reent 体积过大,玄武OS自己将实现 struct _reent
  • Newlib中除了提供C标准中的函数,还定义带后缀 _r 版本的函数,例如 _read_r() , 其中多一个参数 struct _reent * 用于区分不同的线程。