线程
基本概念
从系统的角度看,线程是竞争系统资源的最小运行单元。线程可以使用或等待CPU、使用内存空间等系统资源,并独立于其它线程运行。
OpenHarmony内核每个进程内的线程独立运行、独立调度,当前进程内线程的调度不受其它进程内线程的影响。
OpenHarmony内核中的线程采用抢占式调度机制,同时支持时间片轮转调度和FIFO调度方式。
OpenHarmony内核的线程一共有32个优先级(0-31),最高优先级为0,最低优先级为31。
当前进程内高优先级的线程可抢占当前进程内低优先级线程,当前进程内低优先级线程必须在当前进程内高优先级线程阻塞或结束后才能得到调度。
线程状态说明:
-
初始化(Init):该线程正在被创建。
-
就绪(Ready):该线程在就绪列表中,等待CPU调度。
-
运行(Running):该线程正在运行。
-
阻塞(Blocked):该线程被阻塞挂起。Blocked状态包括:pending(因为锁、事件、信号量等阻塞)、suspended(主动pend)、delay(延时阻塞)、pendtime(因为锁、事件、信号量时间等超时等待)。
-
退出(Exit):该线程运行结束,等待父线程回收其控制块资源。
图 1 线程状态迁移示意图
线程状态迁移说明:
-
Init→Ready:
线程创建拿到控制块后为Init状态,处于线程初始化阶段,当线程初始化完成将线程插入调度队列,此时线程进入就绪状态。
-
Ready→Running:
线程创建后进入就绪态,发生线程切换时,就绪列表中最高优先级的线程被执行,从而进入运行态,但此刻该线程会从就绪列表中删除。
-
Running→Blocked:
正在运行的线程发生阻塞(挂起、延时、读信号量等)时,线程状态由运行态变成阻塞态,然后发生线程切换,运行就绪列表中剩余最高优先级线程。
-
Blocked→Ready :
阻塞的线程被恢复后(线程恢复、延时时间超时、读信号量超时或读到信号量等),此时被恢复的线程会被加入就绪列表,从而由阻塞态变成就绪态。
-
Ready→Blocked:
线程也有可能在就绪态时被阻塞(挂起),此时线程状态会由就绪态转变为阻塞态,该线程从就绪列表中删除,不会参与线程调度,直到该线程被恢复。
-
Running→Ready:
有更高优先级线程创建或者恢复后,会发生线程调度,此刻就绪列表中最高优先级线程变为运行态,那么原先运行的线程由运行态变为就绪态,并加入就绪列表中。
-
Running→Exit:
运行中的线程运行结束,线程状态由运行态变为退出态。若未设置分离属性(PTHREAD_CREATE_DETACHED)的线程,运行结束后对外呈现的是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
|
获取信号量。
|
-
|