4. API 比较细节 |
本章提出了Solaris线索和pthreads 的比较。每一节包含了一个功能描述以及将一个已知的Solaris调用转换为相应的pthreads 调用的细节。
pthreads 实体,例如线索和同步对象,每一个可以展示出多于一种的行为,此行为由创建它们中的状态决定。引用一个属性对象决定了创建的状态,此对象是一个不透明的数据类型,在编程控制下初始化和配置此类型。
属性对象类型为线索、交互锁、和条件变量而存在。系统提供对象本身;它不能直接通过赋值来改变。每一类型支持的属性由pthreads 定义,对于一个实现,它是一个不变量。提供一组函数,以初始化、配置、和释放每一对象类型。
一旦一个属性被初始化和配置,它拥有进程广度的范围。使用属性的推荐的方法,是在程序执行的早期一次配置所有所要求的状态说明。按照pthreads 实体创建函数的需要,可以然后引用合适的属性对象。
#include <pthread.h>
#include <sched.h>
int pthread_attr_init (pthread_attr_t *attr)
int pthread_attr_destroy (pthread_attr_t *attr)
int pthread_attr_setstacksize (pthread_attr_t *attr, size_t
stacksize)
int pthread_attr_getstacksize (pthread_attr_t *attr, size_t
*stacksize)
int pthread_attr_setstackaddr (pthread_attr_t *attr, size_t
stackaddr)
int pthread_attr_getstackaddr (pthread_attr_t *attr, size_t
*stackaddr)
int pthread_attr_setdetachstate (pthread_attr_t *attr, int
detachstate)
int pthread_attr_getdetachstate (pthread_attr_t *attr, int
*detachstate)
int pthread_attr_setscope (pthread_attr_t *attr, int scope)
int pthread_attr_getscope (pthread_attr_t *attr, int *scope)
int pthread_attr_setschedparam (pthread_attr_t *attr, const struct
sched_param *param)
int pthread_attr_getschedparam (pthread_attr_t *attr, struct
sched_param *param)
pthread_attr_init()将与这个对象相联系的属性初始化成它们缺省的值。在执行期间,由线索系统分配存储器。pthread_attr_destroy()移走那个存储器,属性对象变得无效。
缺省的属性值是:
pthread_attr_t attr;
ret = pthread_attr_init (&attr); /* initialize an attribute to default value */
ret = pthread_attr_destroy (&attr); /* destroy an attribute */
堆栈大小属性以字节定义了系统将分配的堆栈的大小。大小不应该小于PTHREAD_STACK_MIN。
pthread_attr_t attr;
int size; size = (PTHREAD_STACK_MIN + 0x1000);
ret = pthread_attr_setstacksize (&attr, size); /* setting a new size */
ret = pthread_attr_getstacksize (&attr, &size); /* getting the stack size */
堆栈地址属性定义了线索堆栈的基址。如果设置为非空值(NULL是缺省),系统将在那个地址初始化堆栈。
pthread_attr_t attr;
void *base;
base = (void *) malloc (PTHREAD_STACK_MIN + 0x1000);
ret = pthread_attr_setstackaddr (&attr, base); /* setting a new address */
ret = pthread_attr_getstackaddr (&attr, base); /* getting the stack address */
PTHREAD_CREATE_DETACHED分离状态预示了行为,如同在thr_create () 调用中的THR_DETACH 标识,那是一个分离的线索。PTHREAD_CREATE_JOINABLE 分离状态等价于非分离线索或者连接到它的终止符上的线索。
pthread_attr_t attr;
int detachstate;
ret = pthread_attr_getdetachstate (&attr, &detachstate); /* get detachstate of thread */
ret = pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
ret = pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_JOINABLE);
pthreads 范围属性设置成PTHREAD_SCOPE_SYSTEM,预示了行为,如同在thr_create () 调用中THR_BOUND 标识,那是一个绑定的线索。如果设置为PTHREAD_SCOPE_PROCESS,将创建一个非绑定的线索。
pthread_attr_t attr;
int scope;
ret = pthread_attr_getscope (&attr, &scope); /* get scope of thread */
ret = pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM); /*bound thread */
ret = pthread_attr_setscope (&attr, PTHREAD_SCOPE_PROCESS); /*unbound thread */
在参数结构中定义调度参数。目前,仅支持优先级。新创建的线索将同所配置的优先级一起运行。
pthread_attr_t attr;
int newprio;
sched_param param;
newprio = 30;
param.sched_priority = newprio; /* set the priority, others are unchanged */
ret = pthread_attr_setschedparam (&tattr, ¶m); /* setting the new scheduling param */
ret = pthread_attr_getschedparam (&tattr, ¶m); /* get existing scheduling param */
Copyright: NPACT |