多线程
少于1分钟
编译配置
编译newlib时,需要增加配置 --enable-newlib-multithread 开启多线程的支持,默认是开启的。
_reent结构体
Newlib中的头文件 reent.h 中,定义了结构体struct _reent ,用于支持多线程:
- 默认情况下,Newlib定义了一个全局的结构体变量
impure_data, 此结构体定义在newlib/libc/reent/impure.c,并使用宏_REENT表示它; struct _reent定义了一些C标准的变量,例如errno、stdin、stdout、stderr等;- 为了支持多线程访问各自的
errno、stdin、stdout和stderr等,需要在 线程对象结构体中增加结构体struct _reent的成员; - 由于
struct _reent体积过大,玄武OS自己将实现struct _reent; - Newlib中除了提供C标准中的函数,还定义带后缀
_r版本的函数,例如_read_r(), 其中多一个参数struct _reent *用于区分不同的线程。