|  | 
| static void | xwos_thd_attr_init (struct xwos_thd_attr *attr) | 
|  | XWOS API:初始化线程属性结构体 
 | 
|  | 
| static xwer_t | xwos_thd_init (struct xwos_thd *thd, xwos_thd_d *thdd, const struct xwos_thd_attr *attr, xwos_thd_f thdfunc, void *arg) | 
|  | XWOS API:静态方式初始化线程 
 | 
|  | 
| static xwer_t | xwos_thd_grab (xwos_thd_d thdd) | 
|  | XWOS API:增加线程对象的引用计数 
 | 
|  | 
| static xwer_t | xwos_thd_put (xwos_thd_d thdd) | 
|  | XWOS API:减少线程对象的引用计数 
 | 
|  | 
| static xwer_t | xwos_thd_create (xwos_thd_d *thdd, const struct xwos_thd_attr *attr, xwos_thd_f thdfunc, void *arg) | 
|  | XWOS API:使用动态申请内存方式创建线程并初始化 
 | 
|  | 
| static xwer_t | xwos_thd_acquire (xwos_thd_d thdd) | 
|  | XWOS API:检查线程对象的标签并增加引用计数 
 | 
|  | 
| static xwer_t | xwos_thd_release (xwos_thd_d thdd) | 
|  | XWOS API:检查对象的标签并减少引用计数 
 | 
|  | 
| static xwer_t | xwos_thd_get_attr (xwos_thd_d thdd, struct xwos_thd_attr *attr) | 
|  | XWOS API:获取线程的属性 
 | 
|  | 
| static xwer_t | xwos_thd_intr (xwos_thd_d thdd) | 
|  | XWOS API:中断线程的阻塞态和睡眠态 
 | 
|  | 
| static xwer_t | xwos_thd_quit (xwos_thd_d thdd) | 
|  | XWOS API:通知线程退出 
 | 
|  | 
| static xwer_t | xwos_thd_join (xwos_thd_d thdd, xwer_t *trc) | 
|  | XWOS API:等待线程结束,回收线程内存资源,抛出它的返回值 
 | 
|  | 
| static xwer_t | xwos_thd_stop (xwos_thd_d thdd, xwer_t *trc) | 
|  | XWOS API:终止线程并等待它退出,回收线程内存资源,并抛出线程的返回值 
 | 
|  | 
| static xwer_t | xwos_thd_detach (xwos_thd_d thdd) | 
|  | XWMP API:分离线程 
 | 
|  | 
| static xwer_t | xwos_thd_migrate (xwos_thd_d thdd, xwid_t dstcpu) | 
|  | XWOS API:将线程迁移到目标CPU 
 | 
|  | 
| static xwos_thd_d | xwos_cthd_self (void) | 
|  | XWOS API:获取当前线程的对象描述符 
 | 
|  | 
| static void | xwos_cthd_get_attr (struct xwos_thd_attr *attr) | 
|  | XWOS API:获取线程自身的属性 
 | 
|  | 
| static void | xwos_cthd_yield (void) | 
|  | XWOS API:当前线程通知调度器重新调度 
 | 
|  | 
| static void | xwos_cthd_exit (xwer_t rc) | 
|  | XWOS API:退出当前线程 
 | 
|  | 
| static bool | xwos_cthd_shld_frz (void) | 
|  | XWOS API:判断当前线程是否可被冻结 
 | 
|  | 
| static bool | xwos_cthd_shld_stop (void) | 
|  | XWOS API:判断当前线程是否可以退出 
 | 
|  | 
| static bool | xwos_cthd_frz_shld_stop (bool *frozen) | 
|  | XWOS API:判断当前线程是否可被冻结,如果是,就冻结线程, 之后再判断线程是否可以退出 
 | 
|  | 
| static xwer_t | xwos_cthd_sleep (xwtm_t dur) | 
|  | XWOS API:线程睡眠一段时间 
 | 
|  | 
| static xwer_t | xwos_cthd_sleep_to (xwtm_t to) | 
|  | XWOS API:线程睡眠到一个时间点 
 | 
|  | 
| static xwer_t | xwos_cthd_sleep_from (xwtm_t *from, xwtm_t dur) | 
|  | XWOS API:线程从一个时间起点睡眠到另一个时间点 
 | 
|  | 
| static xwer_t | xwos_cthd_freeze (void) | 
|  | XWOS API:冻结当前线程 
 | 
|  | 
| static xwer_t | xwos_thd_set_data (xwos_thd_d thdd, xwsq_t pos, void *data) | 
|  | XWOS API:设置线程的本地数据指针 
 | 
|  | 
| static xwer_t | xwos_thd_get_data (xwos_thd_d thdd, xwsq_t pos, void **databuf) | 
|  | XWOS API:获取线程的本地数据指针 
 | 
|  | 
| static xwer_t | xwos_cthd_set_data (xwsq_t pos, void *data) | 
|  | XWOS API:设置当前线程的本地数据指针 
 | 
|  | 
| static xwer_t | xwos_cthd_get_data (xwsq_t pos, void **databuf) | 
|  | XWOS API:获取当前线程的本地数据指针 
 | 
|  | 
技术参考手册: 线程
线程属性
创建或初始化线程之前,需要先描述线程属性 xwos_thd_attr 。 线程属性需要先通过 xwos_thd_attr_init() 初始化后再描述。
已经创建或初始化的线程可以通过 xwos_thd_get_attr() 获取其属性。
线程可以通过 xwos_cthd_get_attr() 获取自身属性。
静态初始化线程
用户可以在编译期预先定义线程对象的结构体、线程栈, 然后运行时通过 xwos_thd_init() 对线程进行初始化。
动态创建线程
用户可以在程序运行时通过 xwos_thd_create() 动态创建线程。
中断线程的阻塞态和睡眠态
用户可以通过 xwos_thd_intr() 中断另一个线程的阻塞态和睡眠态。
线程的连接态与分离态
XWOS线程的分离态与连接态是参考 pthread 设计的:
线程的终止
用户可以通过 xwos_thd_quit() 终止另一个正在运行的线程。 之后可以通过 xwos_thd_join() 等待线程结束运行。
xwos_thd_stop() = xwos_thd_quit() + xwos_thd_join()
线程自己的退出
线程自身可以在主函数中 return 或调用 xwos_cthd_exit() 退出。 线程自身可以通过 xwos_cthd_shld_stop() 判断 是否有其他线程对自己调用了 xwos_thd_quit() 。
线程自身的冻结
线程可以通过 xwos_cthd_shld_frz() 判断自身是否 需要 冻结 。 需要冻结时可调用 xwos_cthd_freeze() 进行冻结。
xwos_cthd_frz_shld_stop() 等价于 xwos_cthd_shld_frz() + xwos_cthd_freeze() + xwos_cthd_shld_stop() 。
线程的迁移
多CPU的系统中,可以通过 xwos_thd_migrate() 迁移线程到另一个CPU。
线程自身的睡眠
线程自身的私有数据
XWOS支持 C11 标准之后引入的 _Thread_local 关键字 。 如果使用 C99 以前的标准,用户可以通过 xwos_cthd_set_data() 和 xwos_cthd_get_data() 可设置和获取线程自身私有变量。
用户也可通过 xwos_thd_set_data() 和 xwos_thd_get_data() 设置和获取 其他线程私有变量。
线程对象的生命周期管理
- 通过 对象指针 管理生命周期:
- 通过 对象描述符 管理生命周期:
对象描述符
线程自身可以通过 xwos_cthd_self() 获取自己的 xwos_thd_d 。
C++
C++头文件: xwos/osal/thd.hxx 
◆ XWOS_STACK_GUARD_SIZE_DEFAULT
      
        
          | #define XWOS_STACK_GUARD_SIZE_DEFAULT   XWMMCFG_STACK_GUARD_SIZE_DEFAULT | 
      
 
 
◆ XWOS_STACK_SIZE_DEFAULT
      
        
          | #define XWOS_STACK_SIZE_DEFAULT   XWMMCFG_STACK_SIZE_DEFAULT | 
      
 
 
◆ XWOS_STACK_SIZE_MIN
      
        
          | #define XWOS_STACK_SIZE_MIN   XWMMCFG_STACK_SIZE_MIN | 
      
 
 
◆ XWOS_THD_LOCAL_DATA_NUM
      
        
          | #define XWOS_THD_LOCAL_DATA_NUM   XWOSDL_THD_LOCAL_DATA_NUM | 
      
 
XWOS API:线程本地数据指针的数量 
在文件 thd.h 第 195 行定义.
 
 
◆ XWOS_THD_NILD
◆ xwos_thd_f
      
        
          | typedef xwer_t(* xwos_thd_f) (void *) | 
      
 
 
◆ xwos_cthd_exit()
  
  | 
        
          | static void xwos_cthd_exit | ( | xwer_t | rc | ) |  |  | inlinestatic | 
 
XWOS API:退出当前线程 
- 参数
- 
  
  
- 注解
- 
此CAPI类似于POSIX线程库中的 pthread_exit() ,会立即终止调用线程,并抛出返回值。 线程调用此CAPI后就结束运行,不再返回。 
在文件 thd.h 第 593 行定义.
  594{
  595        xwosdl_cthd_exit(rc);
  596}
 
 
◆ xwos_cthd_freeze()
  
  | 
        
          | static xwer_t xwos_cthd_freeze | ( | void |  | ) |  |  | inlinestatic | 
 
XWOS API:冻结当前线程 
- 返回
- 错误码 
- 返回值
- 
  
  
- 注解
- 
线程的冻结功能,主要用于两个目的:
- 系统进入低功耗前的准备工作;
- 线程从一个CPU迁移到另一个CPU之前的准备工作。
此CAPI由线程自己调用,冻结自身。但线程并不能随时冻结,必须满足下列条件之一:
可以通过 xwos_cthd_shld_frz() 来判断是否可以冻结。 
在文件 thd.h 第 771 行定义.
  772{
  773        return xwosdl_cthd_freeze();
  774}
 
 
◆ xwos_cthd_frz_shld_stop()
  
  | 
        
          | static bool xwos_cthd_frz_shld_stop | ( | bool * | frozen | ) |  |  | inlinestatic | 
 
XWOS API:判断当前线程是否可被冻结,如果是,就冻结线程, 之后再判断线程是否可以退出 
- 参数
- 
  
    | [out] | frozen | 指向缓冲区的指针,通过此缓冲区返回线程是否被冻结过 |  
 
- 返回
- 布尔值 
- 返回值
- 
  
  
- 注解
- 
此CAPI等价于 xwos_cthd_shld_frz() + xwos_cthd_freeze() + xwos_cthd_shld_stop()
执行顺序是:
参数 frozen 可以告知调用者线程是否发生过冻结,如果不需要这个信息, 可以将参数 frozen 填写为 NULL 。
例如:
xwer_t thread_main(
void * arg)
 
{
                
        }
}
static bool xwos_cthd_frz_shld_stop(bool *frozen)
XWOS API:判断当前线程是否可被冻结,如果是,就冻结线程, 之后再判断线程是否可以退出
在文件 thd.h 第 671 行定义.
  672{
  673        return xwosdl_cthd_frz_shld_stop(frozen);
  674}
 
 
◆ xwos_cthd_get_attr()
XWOS API:获取线程自身的属性 
- 参数
- 
  
  
- 注解
- 
在文件 thd.h 第 566 行定义.
  567{
  568        
  570}
static xwos_thd_d xwos_cthd_self(void)
XWOS API:获取当前线程的对象描述符
static xwer_t xwos_thd_get_attr(xwos_thd_d thdd, struct xwos_thd_attr *attr)
XWOS API:获取线程的属性
 
 
◆ xwos_cthd_get_data()
  
  | 
        
          | static xwer_t xwos_cthd_get_data | ( | xwsq_t | pos, |  
          |  |  | void ** | databuf |  
          |  | ) |  |  |  | inlinestatic | 
 
XWOS API:获取当前线程的本地数据指针 
- 参数
- 
  
    | [in] | pos | 数据存放位置的索引 |  | [out] | databuf | 指向缓冲区的指针,通过此缓冲区返回数据指针 |  
 
- 返回
- 错误码 
- 返回值
- 
  
    | XWOK | 没有错误 |  | -EFAULT | 空指针 |  | -ECHRNG | 位置超出范围 |  
 
- 注解
- 
在文件 thd.h 第 842 行定义.
  843{
  844        return xwosdl_cthd_get_data(pos, databuf);
  845 
  846}
 
 
◆ xwos_cthd_self()
XWOS API:获取当前线程的对象描述符 
- 返回
- 线程对象描述符 
- 注解
- 
在文件 thd.h 第 551 行定义.
  552{
  553        xwosdl_thd_d thdd;
  554 
  555        thdd = xwosdl_cthd_self();
  557}
 
 
◆ xwos_cthd_set_data()
  
  | 
        
          | static xwer_t xwos_cthd_set_data | ( | xwsq_t | pos, |  
          |  |  | void * | data |  
          |  | ) |  |  |  | inlinestatic | 
 
XWOS API:设置当前线程的本地数据指针 
- 参数
- 
  
    | [in] | pos | 数据存放位置的索引 |  | [in] | data | 数据指针 |  
 
- 返回
- 错误码 
- 返回值
- 
  
    | XWOK | 没有错误 |  | -EFAULT | 空指针 |  | -ECHRNG | 位置超出范围 |  
 
- 注解
- 
在文件 thd.h 第 825 行定义.
  826{
  827        return xwosdl_cthd_set_data(pos, data);
  828}
 
 
◆ xwos_cthd_shld_frz()
  
  | 
        
          | static bool xwos_cthd_shld_frz | ( | void |  | ) |  |  | inlinestatic | 
 
XWOS API:判断当前线程是否可被冻结 
- 返回
- 布尔值 
- 返回值
- 
  
  
- 注解
- 
在文件 thd.h 第 607 行定义.
  608{
  609        return xwosdl_cthd_shld_frz();
  610}
 
 
◆ xwos_cthd_shld_stop()
  
  | 
        
          | static bool xwos_cthd_shld_stop | ( | void |  | ) |  |  | inlinestatic | 
 
XWOS API:判断当前线程是否可以退出 
- 返回
- 布尔值 
- 返回值
- 
  
  
- 注解
- 
退出的条件由 xwos_thd_quit() 或 xwos_thd_stop() 设置。 此CAPI常用在线程主循环的循环条件中。例如:
{
                
        }
}
static bool xwos_cthd_shld_stop(void)
XWOS API:判断当前线程是否可以退出
  
在文件 thd.h 第 633 行定义.
  634{
  635        return xwosdl_cthd_shld_stop();
  636}
 
 
◆ xwos_cthd_sleep()
XWOS API:线程睡眠一段时间 
- 参数
- 
  
  
- 返回
- 错误码 
- 返回值
- 
  
    | XWOK | 没有错误 |  | -EINTR | 睡眠过程被中断 |  | -ETIMEDOUT | 输入的时间为负数 |  | -EDSPMPT | 抢占被关闭 |  | -EDSBH | 中断底半部被关闭 |  
 
- 注解
- 
调用此CAPI的线程会睡眠 dur ,线程会在 当前时间点 + dur 时被唤醒。
此CAPI等价于 xwos_cthd_sleep_to(xwtm_ft(dur)) 。 
在文件 thd.h 第 693 行定义.
  694{
  695        return xwosdl_cthd_sleep_to(
xwtm_ft(dur));
 
  696}
static xwtm_t xwtm_ft(xwtm_t dur)
XWOS API:获取当前CPU的未来 系统时间 点
 
 
◆ xwos_cthd_sleep_from()
XWOS API:线程从一个时间起点睡眠到另一个时间点 
- 参数
- 
  
    | [in,out] | from | 指向缓冲区的指针,此缓冲区: 
(I) 作为输入时,作为时间起点(O) 作为输出时,返回线程被唤醒的时间(可作为下一次时间起点,形成精确的周期)  |  | [in] | dur | 期望被唤醒的时间增量(相对于时间原点) |  
 
- 返回
- 错误码 
- 返回值
- 
  
    | XWOK | 没有错误 |  | -EINTR | 睡眠过程被中断 |  | -ETIMEDOUT | 时间点是过去 |  | -EDSPMPT | 抢占被关闭 |  | -EDSBH | 中断底半部被关闭 |  
 
- 注解
- 
调用此CAPI前,需要先确定一个时间起点,可以通过 xwtm_now() 获取当前的 系统时间 作为起点。通过指针 from 将时间起点的地址传递给函数, dur 表示唤醒时间为 *from + dur 。
当线程被唤醒时,*from + dur 会覆盖到指针 from 指向的地址中, 此时 *from 又可作为下次调用此CAPI的时间起点。 由此,循环调用,可以形成周期为 dur ,更为精确的周期性睡眠唤醒。 
在文件 thd.h 第 745 行定义.
  746{
  747        return xwosdl_cthd_sleep_from(from, dur);
  748}
 
 
◆ xwos_cthd_sleep_to()
XWOS API:线程睡眠到一个时间点 
- 参数
- 
  
  
- 返回
- 错误码 
- 返回值
- 
  
    | XWOK | 没有错误 |  | -EINTR | 睡眠过程被中断 |  | -ETIMEDOUT | 输入的时间为负数 |  | -EDSPMPT | 抢占被关闭 |  | -EDSBH | 中断底半部被关闭 |  
 
- 注解
- 
调用此CAPI的线程,睡眠到未来的某个时间点 to 被唤醒:
- to通常是未来的时间,即 当前系统时间 +- delta, 可以使用- xwtm_ft(delta)表示;
- 如果 to是过去的时间点,将直接返回-ETIMEDOUT。
在文件 thd.h 第 716 行定义.
  717{
  718        return xwosdl_cthd_sleep_to(to);
  719}
 
 
◆ xwos_cthd_yield()
  
  | 
        
          | static void xwos_cthd_yield | ( | void |  | ) |  |  | inlinestatic | 
 
XWOS API:当前线程通知调度器重新调度 
- 注解
- 
在文件 thd.h 第 578 行定义.
  579{
  580        xwosdl_cthd_yield();
  581}
 
 
◆ xwos_thd_acquire()
XWOS API:检查线程对象的标签并增加引用计数 
- 参数
- 
  
  
- 返回
- 错误码 
- 返回值
- 
  
    | XWOK | 没有错误 |  | -EOBJDEAD | 线程对象无效 |  | -EACCES | 对象标签检查失败 |  
 
- 注解
- 
在文件 thd.h 第 352 行定义.
  353{
  354        return xwosdl_thd_acquire(&thdd.
thd->
osthd, thdd.
tik);
 
  355}
 
 
◆ xwos_thd_attr_init()
XWOS API:初始化线程属性结构体 
- 参数
- 
  
  
- 注解
- 
线程属性结构体 struct xwos_thd_attr 是对 pthread_attr_t 的简化。
此CAPI功能类似于 pthread_attr_init() 。XWOS的线程属性结构体成员都是基本数据类型, 初始化不会失败,因此此CAPI没有返回值。
XWOS的线程属性结构体对用户透明,用户亦可在定义时直接对结构体成员赋值, 因此XWOS不提供类似于 pthread_attr_setXXX() 与 pthread_attr_getXXX() 的函数组合。
XWOS的线程属性结构体初始化不会额外动态申请内存,因此不需要对 结构体进行销毁,也不存在与 pthread_attr_destroy() 类似的函数。 
在文件 thd.h 第 225 行定义.
  226{
  227        xwosdl_thd_attr_init((struct xwosdl_thd_attr *)attr);
  228}
 
 
◆ xwos_thd_create()
XWOS API:使用动态申请内存方式创建线程并初始化 
- 参数
- 
  
    | [out] | thdd | 指向缓冲区的指针,通过此缓冲区返回线程对象描述符 |  | [in] | attr | 线程属性 |  | [in] | thdfunc | 线程函数的指针 |  | [in] | arg | 线程函数的参数 |  
 
- 返回
- 错误码 
- 注解
- 
- 参数 attr类似于pthread_attr_t,可为NULL,表示采用默认属性创建线程。
- 若通过 attr->stack指定内存作为栈,栈内存的首地址与大小,必须要满足CPU的ABI规则, 例如ARM,就需要8字节对齐,且大小是8的倍数。 因此在定义栈数组时需要使用__xwcc_aligned(8)来修饰。 如果CPU存在DCache,最好让线程栈对齐到缓存线,可获取最高性能, 此时需要使用__xwcc_alignl1cache修饰栈内存数组。
- 如果栈内存也动态申请,地址对齐问题由操作系统内核处理。 
在文件 thd.h 第 331 行定义.
  334{
  335        return xwosdl_thd_create((xwosdl_thd_d *)thdd,
  336                                 (const struct xwosdl_thd_attr *)attr,
  337                                 
  338                                 (xwosdl_thd_f)thdfunc, arg);
  339}
 
 
◆ xwos_thd_detach()
XWMP API:分离线程 
- 参数
- 
  
  
- 返回
- 错误码 
- 返回值
- 
  
    | XWOK | 没有错误 |  | -EINVAL | 线程已经被连接 |  | -EOBJDEAD | 线程对象无效 |  
 
- 注解
- 
此CAPI功能类似于 pthread_detach() ,将线程设置为 分离状态 。 处于 分离状态 的线程退出后,系统会自动回收其内存资源, 不需要另一个线程调用 xwos_thd_join() 来回收其内存资源。
同一个线程对象,可重复调用此CAPI。 
在文件 thd.h 第 517 行定义.
  518{
  519        return xwosdl_thd_detach(&thdd.
thd->
osthd, thdd.
tik);
 
  520}
 
 
◆ xwos_thd_get_attr()
XWOS API:获取线程的属性 
- 参数
- 
  
    | [in] | thdd | 线程对象描述符 |  | [out] | attr | 用于返回线程属性的缓冲区 |  
 
- 返回
- 错误码 
- 返回值
- 
  
    | XWOK | 没有错误 |  | -EOBJDEAD | 线程对象无效 |  | -EACCES | 对象标签检查失败 |  
 
- 注解
- 
在文件 thd.h 第 385 行定义.
  386{
  387        return xwosdl_thd_get_attr(&thdd.
thd->
osthd, thdd.
tik,
 
  388                                   (struct xwosdl_thd_attr *)attr);
  389}
 
 
◆ xwos_thd_get_data()
XWOS API:获取线程的本地数据指针 
- 参数
- 
  
    | [in] | thdd | 线程对象描述符 |  | [in] | pos | 数据存放位置的索引 |  | [out] | databuf | 指向缓冲区的指针,通过此缓冲区返回数据指针 |  
 
- 返回
- 错误码 
- 返回值
- 
  
    | XWOK | 没有错误 |  | -EFAULT | 空指针 |  | -ECHRNG | 位置超出范围 |  
 
- 注解
- 
在文件 thd.h 第 808 行定义.
  809{
  810        return xwosdl_thd_get_data(&thdd.
thd->
osthd, thdd.
tik, pos, databuf);
 
  811}
 
 
◆ xwos_thd_grab()
XWOS API:增加线程对象的引用计数 
- 参数
- 
  
  
- 返回
- 错误码 
- 返回值
- 
  
    | XWOK | 没有错误 |  | -EFAULT | 空指针 |  | -EOBJDEAD | 线程对象无效 |  
 
- 注解
- 
此CAPI主要用于管理 静态对象 的引用计数。 若用于 动态对象 ,需要确保对象的指针一定不是野指针。 
在文件 thd.h 第 287 行定义.
  288{
  289        return xwosdl_thd_grab(&thdd.
thd->
osthd);
 
  290}
 
 
◆ xwos_thd_init()
XWOS API:静态方式初始化线程 
- 参数
- 
  
    | [in] | thd | 指向构造线程对象内存的指针 |  | [out] | thdd | 指向缓冲区的指针,通过此缓冲区返回线程对象描述符 |  | [in] | attr | 线程属性 |  | [in] | thdfunc | 线程函数的指针 |  | [in] | arg | 线程函数的参数 |  
 
- 返回
- 错误码 
- 返回值
- 
  
  
- 注解
- 
此CAPI用于不使用动态内存的方式创建线程。所有需要的内存(线程对象结构体,栈内存数组) 都需要在编译期定义,并且用户需要保证它们的生命周期在线程运行期间始终有效, 通常定义为全局变量。
这种方式创建线程,可在编译期计算出准确的内存使用量, 避免使用动态内存时返回 -ENOMEM 错误, 在一些强调安全的规范中,这是硬性要求。
参数 attr 类似于 pthread_attr_t ,但静态方式初始化线程时不可为空, 必须用来传递预先定义的 线程栈内存 的地址。
栈内存的首地址与大小,必须要满足CPU的ABI规则,例如ARM,就需要8字节对齐, 且大小是8的倍数。因此在定义栈数组时需要使用 __xwcc_aligned(8) 来修饰。
如果CPU存在DCache,最好让数据对齐到缓存线,可获取最高性能, 此时需要使用 __xwcc_alignl1cache 修饰线程对象结构体和栈内存数组。 
在文件 thd.h 第 263 行定义.
  266{
  267        return xwosdl_thd_init(&thd->
osthd, (xwosdl_thd_d *)thdd,
 
  268                               (const struct xwosdl_thd_attr *)attr,
  269                               
  270                               (xwosdl_thd_f)thdfunc, arg);
  271}
 
 
◆ xwos_thd_intr()
XWOS API:中断线程的阻塞态和睡眠态 
- 参数
- 
  
  
- 返回
- 错误码 
- 返回值
- 
  
  
- 注解
- 
- 此CAPI可在 线程 、 中断 、 中断底半部 、 空闲任务 上下文中使用。
- 此CAPI会中断线程的 阻塞状态 和 睡眠状态 , 阻塞和睡眠的函数将以错误码 -EINTR退出。
- 如果线程的 阻塞状态 是不可被中断的,中断将不会发生。 
在文件 thd.h 第 406 行定义.
  407{
  408        return xwosdl_thd_intr(&thdd.
thd->
osthd, thdd.
tik);
 
  409}
 
 
◆ xwos_thd_join()
XWOS API:等待线程结束,回收线程内存资源,抛出它的返回值 
- 参数
- 
  
    | [in] | thdd | 线程对象描述符 |  | [out] | trc | 指向缓冲区的指针,通过此缓冲区返回线程的返回值 |  
 
- 返回
- 错误码 
- 返回值
- 
  
    | XWOK | 没有错误 |  | -EOBJDEAD | 线程对象无效 |  | -EINVAL | 线程不是Joinable的 |  | -EPERM; | 不允许线程join自己 |  | -EALREADY | 线程已被连接 |  
 
- 注解
- 
此CAPI类似于POSIX线程库的 pthread_join() 函数,用于等待另一个线程退出。
父线程 A 调用此CAPI时,会阻塞等待子线程 B 退出。 子线程 B 退出后,此CAPI会释放子线程 B 的内存资源,然后唤醒父线程 A , 并通过 trc 将子线程 B 的返回值返回给父线程 A 。 参数 trc 可为 NULL ,表示不需要获取返回值。
- 父线程 A 的阻塞状态是可被中断的;
- 如果子线程 B 已经提前运行至退出,此CAPI会释放子线程 B 的资源, 然后立即将子线程 B 的返回值返回给父线程 A ;
- 此CAPI只能对 Joinable 的子线程 B 使用;
- 对 Detached 的子线程 B 调用此CAPI会得到错误码 -EINVAL;
- 多个线程对同一个子线程 B 进行 xwos_thd_join(),会返回错误码-EALREADY;
- 父线程 A 对自己调用此CAPI,会返回错误码 -EPERM。
在文件 thd.h 第 472 行定义.
  473{
  474        return xwosdl_thd_join(&thdd.
thd->
osthd, thdd.
tik, trc);
 
  475}
 
 
◆ xwos_thd_migrate()
XWOS API:将线程迁移到目标CPU 
- 参数
- 
  
    | [in] | thdd | 线程对象描述符 |  | [in] | dstcpu | 目标CPU的ID |  
 
- 返回
- 错误码 
- 返回值
- 
  
    | XWOK | 没有错误 |  | -ENODEV | CPU序号不存在 |  | -EOBJDEAD | 线程对象无效 |  
 
- 注解
- 
此CAPI用于将线程 thdd.thd 迁移到另一个CPU dstcpu 上。
此CAPI是异步的,只会发起一个软中断就返回。 线程的迁移由内核在软中断中完成。 
在文件 thd.h 第 539 行定义.
  540{
  541        return xwosdl_thd_migrate(&thdd.
thd->
osthd, thdd.
tik, dstcpu);
 
  542}
 
 
◆ xwos_thd_put()
XWOS API:减少线程对象的引用计数 
- 参数
- 
  
  
- 返回
- 错误码 
- 返回值
- 
  
    | XWOK | 没有错误 |  | -EFAULT | 空指针 |  | -EOBJDEAD | 线程对象无效 |  
 
- 注解
- 
此CAPI主要用于管理 静态对象 的引用计数。 若用于 动态对象 ,需要确保对象的指针一定不是野指针。 
在文件 thd.h 第 306 行定义.
  307{
  308        return xwosdl_thd_put(&thdd.
thd->
osthd);
 
  309}
 
 
◆ xwos_thd_quit()
XWOS API:通知线程退出 
- 参数
- 
  
  
- 返回
- 错误码 
- 返回值
- 
  
  
- 注解
- 
此CAPI用于向另一个子线程 B 设置 退出状态 。
- 此CAPI可在 线程 、 中断 、 中断底半部 、 空闲任务 上下文中使用, 不会等待子线程 B 退出。
- 子线程 B 可以是 Joinable 的,也可以是 Detached 的。
- 此CAPI可被重复调用,子线程 B 退出状态 一旦被设置,不可被清除。
- 此CAPI会中断子线程 B 的 阻塞状态 和 睡眠状态 , 阻塞和睡眠的函数将以错误码 -EINTR退出。
- 如果子线程 B 的 阻塞状态 是不可被中断的,中断将不会发生。
- 子线程 B 可以通过 xwos_cthd_shld_stop()检测 退出状态 。
在XWOS-V2.0以前,此CAPI被命名为 xwos_thd_cancel() , 名称类似于 pthread_cacnel() ,但功能差异较大。 为避免迷惑,将其改名为 xwos_thd_quit() 。 
在文件 thd.h 第 437 行定义.
  438{
  439        return xwosdl_thd_quit(&thdd.
thd->
osthd, thdd.
tik);
 
  440}
 
 
◆ xwos_thd_release()
XWOS API:检查对象的标签并减少引用计数 
- 参数
- 
  
  
- 返回
- 错误码 
- 返回值
- 
  
    | XWOK | 没有错误 |  | -EOBJDEAD | 线程对象无效 |  | -EACCES | 对象标签检查失败 |  
 
- 注解
- 
在文件 thd.h 第 368 行定义.
  369{
  370        return xwosdl_thd_release(&thdd.
thd->
osthd, thdd.
tik);
 
  371}
 
 
◆ xwos_thd_set_data()
XWOS API:设置线程的本地数据指针 
- 参数
- 
  
    | [in] | thdd | 线程对象描述符 |  | [in] | pos | 数据存放位置的索引 |  | [in] | data | 数据指针 |  
 
- 返回
- 错误码 
- 返回值
- 
  
    | XWOK | 没有错误 |  | -EFAULT | 空指针 |  | -ECHRNG | 位置超出范围 |  
 
- 注解
- 
在文件 thd.h 第 790 行定义.
  791{
  792        return xwosdl_thd_set_data(&thdd.
thd->
osthd, thdd.
tik, pos, data);
 
  793}
 
 
◆ xwos_thd_stop()
XWOS API:终止线程并等待它退出,回收线程内存资源,并抛出线程的返回值 
- 参数
- 
  
    | [in] | thdd | 线程对象描述符 |  | [out] | trc | 指向缓冲区的指针,通过此缓冲区返回线程的返回值 |  
 
- 返回
- 错误码 
- 返回值
- 
  
    | XWOK | 没有错误 |  | -EOBJDEAD | 线程对象无效 |  | -EINVAL | 线程不是Joinable的 |  | -EPERM; | 不允许线程stop自己 |  | -EALREADY | 线程已连接 |  
 
- 注解
- 
此CAPI等价于 xwos_thd_quit() + xwos_thd_join() 。
参数 trc 可为 NULL ,表示不需要获取返回值。 
在文件 thd.h 第 495 行定义.
  496{
  497        return xwosdl_thd_stop(&thdd.
thd->
osthd, thdd.
tik, trc);
 
  498}