线程

基本概念

从系统的角度看,线程是竞争系统资源的最小运行单元。线程可以使用或等待CPU、使用内存空间等系统资源,并独立于其它线程运行。

OpenHarmony内核每个进程内的线程独立运行、独立调度,当前进程内线程的调度不受其它进程内线程的影响。

OpenHarmony内核中的线程采用抢占式调度机制,同时支持时间片轮转调度和FIFO调度方式。

OpenHarmony内核的线程一共有32个优先级(0-31),最高优先级为0,最低优先级为31。

当前进程内高优先级的线程可抢占当前进程内低优先级线程,当前进程内低优先级线程必须在当前进程内高优先级线程阻塞或结束后才能得到调度。

线程状态说明:

  • 初始化(Init):该线程正在被创建。

  • 就绪(Ready):该线程在就绪列表中,等待CPU调度。

  • 运行(Running):该线程正在运行。

  • 阻塞(Blocked):该线程被阻塞挂起。Blocked状态包括:pend(因为锁、事件、信号量等阻塞)、suspend(主动pend)、delay(延时阻塞)、pendtime(因为锁、事件、信号量时间等超时等待)。

  • 退出(Exit):该线程运行结束,等待父线程回收其控制块资源。

图 1 线程状态迁移示意图

线程 - 图1

线程状态迁移说明:

  • Init→Ready:

    线程创建拿到控制块后为Init状态,处于线程初始化阶段,当线程初始化完成将线程插入调度队列,此时线程进入就绪状态。

  • Ready→Running:

    线程创建后进入就绪态,发生线程切换时,就绪列表中最高优先级的线程被执行,从而进入运行态,但此刻该线程会从就绪列表中删除。

  • Running→Blocked:

    正在运行的线程发生阻塞(挂起、延时、读信号量等)时,该线程会从就绪列表中删除,线程状态由运行态变成阻塞态,然后发生线程切换,运行就绪列表中剩余最高优先级线程。

  • Blocked→Ready / Blocked→Running:

    阻塞的线程被恢复后(线程恢复、延时时间超时、读信号量超时或读到信号量等),此时被恢复的线程会被加入就绪列表,从而由阻塞态变成就绪态;此时如果被恢复线程的优先级高于正在运行线程的优先级,则会发生线程切换,将该线程由就绪态变成运行态。

  • Ready→Blocked:

    线程也有可能在就绪态时被阻塞(挂起),此时线程状态会由就绪态转变为阻塞态,该线程从就绪列表中删除,不会参与线程调度,直到该线程被恢复。

  • Running→Ready:

    有更高优先级线程创建或者恢复后,会发生线程调度,此刻就绪列表中最高优先级线程变为运行态,那么原先运行的线程由运行态变为就绪态,并加入就绪列表中。

  • Running→Exit:

    运行中的线程运行结束,线程状态由运行态变为退出态。若未设置分离属性(PTHREAD_CREATE_DETACHED)的线程,运行结束后对外呈现的是Exit状态,即退出态。

  • Blocked→Exit:

    阻塞的线程调用删除接口,线程状态由阻塞态变为退出态。

使用场景

线程创建后,用户态可以执行线程调度、挂起、恢复、延时等操作,同时也可以设置线程优先级和调度策略,获取线程优先级和调度策略。

功能

OpenHarmony内核系统中的线程管理模块,线程间通信为用户提供下面几种功能:

表 1 线程管理模块功能

头文件

名称

说明

备注

pthread.h

pthread_attr_destroy

销毁线程属性对象。

-

pthread.h

pthread_attr_getinheritsched

获取线程属性对象的调度属性。

-

pthread.h

pthread_attr_getschedparam

获取线程属性对象的调度参数属性。

-

pthread.h

pthread_attr_getschedpolicy

获取线程属性对象的调度策略属性。

OpenHarmony:支持SCHED_FIFO 、SCHED_RR调度策略。

pthread.h

pthread_attr_getstacksize

获取线程属性对象的堆栈大小。

-

pthread.h

pthread_attr_init

初始化线程属性对象。

-

pthread.h

pthread_attr_setdetachstate

设置线程属性对象的分离状态。

-

pthread.h

pthread_attr_setinheritsched

设置线程属性对象的继承调度属性。

-

pthread.h

pthread_attr_setschedparam

设置线程属性对象的调度参数属性。

OpenHarmony:设置线程优先级的参数值越小,线程在系统中的优先级越高;设置参数值越大,优先级越低。

注意:需要将pthread_attr_t线程属性的inheritsched字段设置为PTHREAD_EXPLICIT_SCHED,否则设置的线程调度优先级将不会生效,系统默认设置为PTHREAD_INHERIT_SCHED。

pthread.h

pthread_attr_setschedpolicy

设置线程属性对象的调度策略属性。

OpenHarmony:支持SCHED_FIFO 、SCHED_RR调度策略。

pthread.h

pthread_attr_setstacksize

设置线程属性对象的堆栈大小。

-

pthread.h

pthread_getattr_np

获取已创建线程的属性。

-

pthread.h

pthread_cancel

向线程发送取消请求。

-

pthread.h

pthread_testcancel

请求交付任何未决的取请求。

-

pthread.h

pthread_setcanceltype

设置线程可取消类型。

-

pthread.h

pthread_setcancelstate

设置线程可取消状态。

-

pthread.h

pthread_create

创建一个新的线程。

-

pthread.h

pthread_detach

分离一个线程。

-

pthread.h

pthread_equal

比较两个线程ID是否相等。

-

pthread.h

pthread_exit

终止正在调用的线程。

-

pthread.h

pthread_getschedparam

获取线程的调度策略和参数。

OpenHarmony:支持SCHED_FIFO 、SCHED_RR调度策略。

pthread.h

pthread_join

等待指定的线程结束。

-

pthread.h

pthread_self

获取当前线程的ID。

-

pthread.h

pthread_setschedprio

设置线程的调度静态优先级。

-

pthread.h

pthread_kill

向线程发送信号。

-

pthread.h

pthread_once

使函数调用只能执行一次。

-

pthread.h

pthread_atfork

注册fork的处理程序。

-

pthread.h

pthread_cleanup_pop

删除位于清理处理程序堆栈顶部的例程。

-

pthread.h

pthread_cleanup_push

将例程推送到清理处理程序堆栈的顶部。

-

pthread.h

pthread_barrier_destroy

销毁屏障对象(高级实时线程)

-

pthread.h

pthread_barrier_init

初始化屏障对象(高级实时线程)

-

pthread.h

pthread_barrier_wait

屏障同步(高级实时线程)

-

pthread.h

pthread_barrierattr_destroy

销毁屏障属性对象。

-

pthread.h

pthread_barrierattr_init

初始化屏障属性对象。

-

pthread.h

pthread_mutex_destroy

销毁互斥锁。

-

pthread.h

pthread_mutex_init

初始化互斥锁。

-

pthread.h

pthread_mutex_lock

互斥锁加锁操作。

-

pthread.h

pthread_mutex_trylock

互斥锁尝试加锁操作。

-

pthread.h

pthread_mutex_unlock

互斥锁解锁操作。

-

pthread.h

pthread_mutexattr_destroy

销毁互斥锁属性对象。

-

pthread.h

pthread_mutexattr_gettype

获取互斥锁类型属性。

-

pthread.h

pthread_mutexattr_init

初始化互斥锁属性对象。

-

pthread.h

pthread_mutexattr_settype

设置互斥锁类型属性。

-

pthread.h

pthread_mutex_timedlock

使用超时锁定互斥锁。

-

pthread.h

pthread_rwlock_destroy

销毁读写锁。

-

pthread.h

pthread_rwlock_init

初始化读写锁。

-

pthread.h

pthread_rwlock_rdlock

获取读写锁读锁操作。

-

pthread.h

pthread_rwlock_timedrdlock

使用超时锁定读写锁读锁。

-

pthread.h

pthread_rwlock_timedwrlock

使用超时锁定读写锁写锁。

-

pthread.h

pthread_rwlock_tryrdlock

尝试获取读写锁读锁操作。

-

pthread.h

pthread_rwlock_trywrlock

尝试获取读写锁写锁操作。

-

pthread.h

pthread_rwlock_unlock

读写锁解锁操作。

-

pthread.h

pthread_rwlock_wrlock

获取读写锁写锁操作。

-

pthread.h

pthread_rwlockattr_destroy

销毁读写锁属性对象。

-

pthread.h

pthread_rwlockattr_init

初始化读写锁属性对象。

-

pthread.h

pthread_cond_broadcast

解除若干已被等待条件阻塞的线程。

-

pthread.h

pthread_cond_destroy

销毁条件变量。

-

pthread.h

pthread_cond_init

初始化条件变量。

-

pthread.h

pthread_cond_signal

解除被阻塞的线程。

-

pthread.h

pthread_cond_timedwait

定时等待条件。

-

pthread.h

pthread_cond_wait

等待条件。

-

semaphore.h

sem_destroy

销毁指定的无名信号量。

-

semaphore.h

sem_getvalue

获得指定信号量计数值。

-

semaphore.h

sem_init

创建并初始化一个无名信号量。

-

semaphore.h

sem_post

增加信号量计数。

-

semaphore.h

sem_timedwait

获取信号量,且有超时返回功能。

-

semaphore.h

sem_trywait

尝试获取信号量。

-

semaphore.h

sem_wait

获取信号量。

-