线程优先级相关函数
<h1 id="任务优先级">任务优先级</h1><p>Linux系统中任务优先级分为两种:一种是静态优先级,一种是动态优先级</p>
<ul>
<li>静态优先级指的是任务一旦设置好优先级之后就不能再改变,相当于是任务本身的属性,优先级范围是0~99,优先级数值越大则优先级越高。</li>
<li>普通任务的优先级是0,系统任务的优先级是1~99</li>
</ul>
<h2 id="pthread_attr_setinheritsched函数">pthread_attr_setinheritsched函数</h2>
<p>此函数可以设置线程的继承调度属性</p>
<pre><code>int pthread_attr_setinheritsched(pthread_attr_t *attr, int inheritsched);
//attr:指向 pthread_attr_t 类型的指针,表示线程属性结构
//inheritsched:指定线程的调度策略继承方式
//PTHREAD_INHERIT_SCHED:新线程继承父线程的调度策略和参数
//PTHREAD_EXPLICIT_SCHED:新线程使用显式指定的调度策略和参数
//ret:成功返回 0,失败返回错误码
</code></pre>
<h2 id="pthread_attr_getinheritsched函数">pthread_attr_getinheritsched函数</h2>
<p>此函数可以获取线程的继承调度属性</p>
<pre><code>int pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inheritsched);
//attr:指向 pthread_attr_t 类型的指针,表示线程属性结构
//inheritsched:指定线程的调度策略继承方式
//ret:成功返回 0,失败返回错误码
</code></pre>
<p><mark>notice:</mark>一条线程如果以默认的属性进行创建,则该线程的调度策略被设置为SCHED_OTHER,并且线程的优先级默认设置为0,意味着创建的线程属于普通任务。</p>
<h1 id="线程的调度策略">线程的调度策略</h1>
<p>Linux系统中线程的调度策略分三种:SCHED_OTHER、SCHED_FIFO、SCHED_RR</p>
<ul>
<li>SCHED_OTHER调度策略指的是分时调度策略<br>
<mark>注意:</mark>如果一个线程以SCHED_OTHER调度策略进行创建,线程的静态优先级必须设置为0。</li>
<li>SCHED_FIFO调度策略指的是实时调度策略,采用“先到先服务”的调度方式,当一条线程采用该调度策略则会一直运行,直到它被更高优先级的线程抢占或者主动放弃CPU,才会交出控制权。</li>
<li>SCHED_RR指的是实时调度策略,是一种基于时间片轮转的调度策略,它会给每个线程设置一个固定的优先级,并按照优先级顺序对线程进行轮流调度。</li>
</ul>
<h2 id="pthread_attr_setschedpolicy函数">pthread_attr_setschedpolicy函数</h2>
<p>此函数可以设置线程的调度属性</p>
<pre><code>int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
//attr:指向 pthread_attr_t 类型的指针,表示线程属性结构
//policy:线程的调度策略
//ret:成功返回 0,失败返回错误码
</code></pre>
<h2 id="pthread_attr_getschedpolicy函数">pthread_attr_getschedpolicy函数</h2>
<p>此函数可以获取线程的调度属性</p>
<pre><code>int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy);
//attr:指向 pthread_attr_t 类型的指针,表示线程属性结构
//policy:线程的调度策略
//ret:成功返回 0,失败返回错误码
</code></pre>
<h2 id="pthread_attr_setschedparam函数">pthread_attr_setschedparam函数</h2>
<p>该函数可以设置线程的优先级</p>
<pre><code>struct sched_param {
int sched_priority; // 线程的优先级
};
int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);
//attr:指向 pthread_attr_t 类型的指针,表示线程属性结构
//param:struct sched_param 类型的指针,表示线程的调度参数
//ret:成功返回 0,失败返回错误码
//notice:如果线程的调度策略是SCHED_OTHER,则线程的优先级必须设置为0,用于表示普通任务
</code></pre>
<h2 id="pthread_attr_setschedparam函数-1">pthread_attr_setschedparam函数</h2>
<p>该函数可以获取线程的优先级</p>
<pre><code>int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param);
//attr:指向 pthread_attr_t 类型的指针,表示线程属性结构
//param:struct sched_param 类型的指针,表示线程的调度参数
//ret:成功返回 0,失败返回错误码
</code></pre>
<h1 id="动态优先级">动态优先级</h1>
<p>动态优先级指的是当多个普通任务并发运行时,系统会根据其实际运行的表现来动态地调整他们的nice值<br>
<mark>注意:</mark>Linux系统中线程的nice值越高,则优先级越低,而nice值越低,反而优先级越高,nice的范围为 -20 ~ 19</p>
<pre><code>int nice(int incr);
//incr:要调整的优先级增量
//ret:成功返回调整后的nice值,失败返回错误码
</code></pre>
<h1 id="线程信号响应">线程信号响应</h1>
<p>当一个进程收到信号之后,进程中的哪个线程响应此信号是不确定的</p>
<h2 id="pthread_kill函数">pthread_kill函数</h2>
<p>该函数可以向指定的线程发送信号</p>
<pre><code>int pthread_kill(pthread_t thread, int sig);
//thread:指定要发送信号的线程的ID
//sig:指定要发送的信号 SIGTERM:终止线程 SIGINT:中断线程等
//ret:成功返回 0,失败返回错误码
</code></pre>
<h2 id="pthread_sigqueue函数">pthread_sigqueue函数</h2>
<p>此函数可以给某个线程发送信号并发送一个额外的数据</p>
<pre><code>union sigval {
int sival_int; // 整数值
void *sival_ptr;// 指针值
};
int pthread_sigqueue(pthread_t thread, int sig, const union sigval value);
//thread:指定要发送信号的线程的ID
//sig:指定要发送的信号 SIGTERM:终止线程 SIGINT:中断线程等
//value:指定要传递给线程的值
//ret:成功返回 0,失败返回错误码
</code></pre>
<h2 id="sigprocmask函数">sigprocmask函数</h2>
<p>该函数可以对某个信号进行屏蔽</p>
<pre><code>int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
//how:修改信号掩码
//SIG_BLOCK:将 set 中的信号添加到当前信号掩码中,阻塞这些信号。
//SIG_UNBLOCK:从当前信号掩码中移除 set 中的信号,解除这些信号的阻塞。
//SIG_SETMASK:将当前信号掩码设置为 set 中的值,直接替换当前信号掩码。
//set:信号集合
//oldset:填NULL即可
</code></pre>
<pre><code></code></pre><br><br>
来源:https://www.cnblogs.com/lradian/p/18873223
頁:
[1]