浅谈
pthread_setschedparam
的使用
int pthread_setschedparam(pthread_t target_thread,
int
policy,
const
struct sched_param *param)
在多线程开发中经常被使用的,它主要用于设置线程的调用策略和优先级。在介绍它的使用方法之前,我们先简单的介绍一下它的使用参数。
1. target_thread
是使用
pthread_create
所获得的线程
ID
。
2
.线程的调度有三种策略:
SCHED_OTHER
、
SCHED_RR
和
SCHED_FIFO
。
Policy
用于指明使用哪种策略。下面我们简单的说明一下这三种调度策略。
SCHED_OTHER
它是默认的线程分时调度策略,所有的线程的优先级别都是
0
,线程的调度是通过分时来完成的。简单地说,如果系统使用这种调度策略,程序将无法设置线程的优先级。请注意,这种调度策略也是抢占式的,当高优先级的线程准备运行的时候,当前线程将被抢占并进入等待队列。这种调度策略仅仅决定线程在可运行线程队列中的具有相同优先级的线程的运行次序。
SCHED_FIFO
它是一种实时的先进先出调用策略,且只能在超级用户下运行。这种调用策略仅仅被使用于优先级大于
0
的线程。它意味着,使用
SCHED_FIFO
的可运行线程将一直抢占使用
SCHED_OTHER
的运行线程
浅谈pthread_setschedparam的使用int pthread_setschedparam(pthread_t target_thread, int policy, const struct sched_param *param)在多线程开发中经常被使用的,它主要用于设置线程的调用策略和优先级。在介绍它的使用方法之前,我们先简单的介绍一下它的使用参数。1. targ
int p
thread
_create(p
thread
_t *
thread
, const p
thread
_attr_t *attr,
void *(*start_routine)(void*), void *arg);
来创建线程,但是如何设置线程的优先级呢?
在讨论这个问题的时候,我们先要确定当前线程
使用
的调度策略,posix提供了
int p
thread
_attr_getschedpolicy(const p
thread
_attr_t *attr, int *po.
照着GUN/Linux编程指南中的一个例子输入编译,结果出现如下错误:
undefined reference to ‘p
thread
_create’undefined reference to ‘p
thread
_join’
问题原因: p
thread
库不是 Linux 系统默认的库,连接时需要
使用
静态库 libp
thread
.a,所以在
使用
p
thread
_create()创建线程,以及调用 p
thread
_atfork()函数建立fork处理程序时,需要链接该库。
问题解决: 在编译中要加 -lp
thread
参数 gcc
thread
.c -o
thread
-lpthr
向线程函数传递参数的程序示例;
一个资源包,执行 tar zxvf example.tar.gz 解压资源;
复制readme.txt中的编译语句,编译得到可执行程序
thread
test;
./
thread
test 执行皆可看到效果。
p
thread
_
set
schedpa
ram
设置线程的权限
int p
thread
_
set
schedpa
ram
(p
thread
_t target_
thread
, int policy, const
struct
sched_pa
ram
*pa
ram
)
参数 1. target_
thread
是
使用
p
thread
_create所获得的线程ID。
2.线程的调度有三种策略:SCHED_OT
浅谈
p
thread
_
set
schedpa
ram
的
使用
int p
thread
_
set
schedpa
ram
(p
thread
_t target_
thread
, int policy, const
struct
sched_pa
ram
*pa
ram
)在
多线程
开发中经常被
使用
的,它主要用于设置线程的调用策略和优先级。在介绍它的
使用
方法之前,我们先简单的介绍一下它的
使用
参数。
1. targ...
设置以下关于调度策略之前应该首先通过p
thread
_attr_
set
inheritsched设置P
THREAD
_EXPLICIT_SCHED.
1) Scheduling Scope
http://man7.org/linux/man-pages/man3/p
thread
_attr_
set
scope.3.html
通过p
thread
_attr_
set
scope()可以设置线程的资源竞争范围,包...
在工作中遇到
使用
p
thread
_
set
schedpa
ram
时,返回了EPERM 异常,该异常是说没有权限。
程序运行的环境是,ssh 连接到一台linux环境下,sudo su切换到root用户。这似乎是一个系统bug。详细的过程见:https://github.com/coreos/bugs/issues/410
从该issue中,提供了两种方法:
第一:更改 kernel.sched_rt_runtime_us 值为 -1.
操作:sysctl kernel.sched_rt_runtime_us,
int p
thread
_create(p
thread
_t *
thread
, const p
thread
_attr_t *attr, void *(*start_routine) (void *), void *arg);
-
thread
: 返回新线程的标识符。
- attr: 线程属性,可以为NULL。
- start_routine: 线程入口函数,新线程开始执行的函数。
- arg: 传递给线程入口函数的参数。
示例代码:
#include <p
thread
.h>
#include <stdio.h>
void *my_
thread
(void *arg)
printf("
Thread
ID: %ld\n", p
thread
_self());
return NULL;
int main()
p
thread
_t
thread
;
int ret;
ret = p
thread
_create(&
thread
, NULL, my_
thread
, NULL);
if (ret != 0) {
printf("Failed to create
thread
.\n");
return -1;
printf("
Thread
ID: %ld\n",
thread
);
p
thread
_join(
thread
, NULL);
return 0;
可以看出 p
thread
_create 函数返回0成功, 其他值则为失败。
struct sched_param schedule_parameters;
printf("--- Show policy and priority of current thread:\n");
err = pthread_getschedparam(pthread_self(), &policy, &schedule_parameters );
assert( !err );
switch (policy)
case SCHED_FIFO:
printf("--- policy = SCHED_FIFO\n");
break;
case SCHED_RR:
printf("--- policy = SCHED_RR\n");
break;
case SCHED_OTHER:
printf("--- policy = SCHED_OTHER\n");
break;
default:
printf("--- policy = UNKNOWN\n");
break;
printf("--- Current thread's sched_priority = %d\n", schedule_parameters.sched_priority);
[/code]
Python utf-8与byte的解码问题