多线程
少于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 *
用于区分不同的线程。