线程栅栏

XWOS的线程栅栏

概述

XWOS的线程栅栏是用于协调多个线程并行工作的同步机制。

线程栅栏在创建时,会指明有多少个线程槽。 当线程到达线程栅栏时会阻塞并等待,直到指定数量的线程都达到线程栅栏,所有线程被同时唤醒。

线程栅栏对象与对象描述符描述符

线程栅栏对象是 XWOS对象 struct xwos_object 的派生类 。 类似的,线程栅栏对象也用 线程栅栏对象描述符 xwos_br_d 来解决有效性和身份合法性的问题。

线程栅栏对象描述符由 线程栅栏对象的指针标签 组成:

typedef struct {
        struct xwos_br * br; /**< 线程栅栏对象的指针 */
        xwsq_t tik; /**< 标签 */
} xwos_br_d;

通过对象描述符引用对象时,首先检测 obj->magic 的值,是否为 0x58574F53U ,由此可确定指针 obj 指向一个有效的 XWOS的对象 。 然后对比标签 obj->tiktik 是否相等,由此可以确定对象的 身份 。 因为对象的 tik 是全局唯一的,当对象被释放后,它的 tik 会被析构函数析构为 0 。 当内存地址被重新构建为新的对象,那么它的 tik 一定与对象描述符的 tik 不一致。

线程栅栏的初始化、销毁与动态创建、删除

静态初始化、销毁

  • 静态初始化: xwos_br_init()
    • 静态 是指用户预先定义线程结构体对象,这些对象在编译期由编译器分配内存。
  • 销毁静态初始化的线程栅栏: xwos_br_fini()

动态创建、删除

  • 动态创建: xwos_br_create()
    • 动态 是指程序在运行时,通过内存分配函数申请内存,并在申请的内存上构造对象。
  • 删除动态创建的线程栅栏: xwos_br_delete()

通过线程栅栏同步线程

  • xwos_br_wait() :等待所有线程到达栅栏,只能在 线程 上下文使用
  • xwos_br_wait_to() :限时等待所有线程到达栅栏,只能在 线程 上下文使用

绑定与解绑信号选择器

可以通过 xwos_br_bind() 将线程栅栏绑定到 信号选择器 上。 当指定数量的线程抵达线程栅栏时,线程栅栏会向 信号选择器 发送一个 选择信号 。此时 信号选择器 会唤醒正在等待的线程。

绑定后的线程栅栏可以通过 xwos_br_unbind() 解绑。

线程栅栏对象的生命周期管理

线程栅栏对象的基类是 XWOS对象 struct xwos_object 。 线程栅栏对象也有两组生命周期管理的CAPI:

  • 使用 对象指针 访问生命周期管理的CAPI:需要确保调用CAPI时,对象一定是有效的,且不存在 释放-又被申请 为另一个对象的情况。

    • xwos_br_grab() :增加引用计数。
    • xwos_br_put() :减少引用计数,当引用计数减少为 0 时,调用垃圾回收函数释放对象。
  • 使用 对象描述符 访问生命周期管理的CAPI:用户无法确保对象一定有效或无法确保对象不会变成另一个对象时使用。

    • xwos_br_acquire() :通过对象描述符确定对象有效且合法,再增加引用计数。
    • xwos_br_release() :通过对象描述符确定对象有效且合法,再减少引用计数。 当引用计数减少为 0 时,调用垃圾回收函数释放对象。

API参考