首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Posix Threads -- Thread Attributes

Posix Threads -- Thread Attributes

#include

int pthread_attr_init(pthread_attr_t *attr);

int pthread_attr_destroy(pthread_attr_t   *attr);


                                          Both return: 0 if OK, error number on failure


说明:
1.使用 pthread_attr_t 类型的结构体可以修改线程的默认属性。
2.使用 pthread_attr t 结构体之前,首先要调用 pthread_attr_init ,会将结构体中各属性设为默认值;
使用完后,调用 pthread_attr_destroy 将结构体中各属性设为无效值。
3.POSIX.1 Thread 提供了下表所示的 4 种主要属性:Figure 12.3. POSIX.1 thread attributesName
Description
FreeBSD 5.2.1
Linux 2.4.22
Mac OS X 10.3
Solaris 9
detachstate
detached thread attribute
?
?
?
?
guardsize
guard buffer size in bytes at end of thread stack

?
?
?
stackaddr
lowest address of thread stack
ob
?
?
ob
stacksize
size in bytes of thread stack
?
?
?
?



#include

int pthread_attr_getdetachstate(const pthread_attr_t *restrict attr,
                                int *detachstate);

int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);Both return: 0 if OK, error number on failure

说明:
1.用来设置或获取 pthread_attr_t 结构体分离状态的值。两个有效值分别为:PTHREAD_CREATE_DETACHED 和
PTHREAD_CREATE_JOINABLE。
2.关于 detachstate 请参考另一篇文章 :线程和进程的分离(detach)



#include

int pthread_attr_getstack(const pthread_attr_t *restrict attr,
                          void **restrict stackaddr,
                          size_t *restrict stacksize);

int pthread_attr_setstack(const pthread_attr_t *attr,
                          void *stackaddr, size_t stacksize);Both return: 0 if OK, error number on failure

说明:
1.POSIX 线程栈的属性是可选的。要确定系统是否支持,可以检查 _POSIX_THREAD_ATTR_STACKADDR 和
_POSIX_THREAD_ATTR_STACKSIZE 是否定义,或在运行时对 _SC_THREAD_ATTR_STACKADDR 和
_SC_THREAD_ATTR_STACKSIZE 调用 sysconf 函数。
2.在多线程的环境下,各线程的栈空间累计可能会超过进程总的地址空间。当进程空间用完时,可为
线程动态分配新的地址空间,并用 pthread_attr_setstack 进行设置。
3.传入的 stackaddr 参数为栈空间的最低内存地址。




#include

int pthread_attr_getstacksize(const pthread_attr_t *restrict attr,
                              size_t *restrict stacksize);

int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);


                                        Both return: 0 if OK, error number on failure

说明:
当只是想改变默认栈空间的大小,但不想设置栈地址时,可以调用这两个函数。




#include

int pthread_attr_getguardsize(const pthread_attr_t *restrict attr,
                              size_t *restrict guardsize);

int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);


                                        Both return: 0 if OK, error number on failure

说明:
1.guard size,即在一个线程的stack的结尾可以加入一段guard区域(默认大小为 PAGESIZE),当发生
stack overflow时,访问到该区域的时候,该线程会收到signal。
2.当调用 pthread_attr_setstack 设置了新的栈空间时,系统会认为我们自己会管理栈空间,从而将
guard size 属性设为 0 。




另外,POSIX 提供了不用 pthread_attr_t 表示的其他的线程属性:
  • The cancelability state
  • The cancelability type
  • The concurrency level



#include

int pthread_getconcurrency(void);                                               Returns: current concurrency level

int pthread_setconcurrency(int level);                                               Returns: 0 if OK, error number on failure

说明:
1. 所谓的 concurrency level ,解释为线程并发等级。对于 N:M 的 用户线程到内核线程的模型来说,
使用 concurrency level 可以更改 N 值,增加同时运行的用户线程的数量。对于 1:1 模型来说,不起
作用,因为 1 个用户线程对应 1 个内核线程。
2. pthread_setconcurrency 只是一种指示,并非命令。系统并不保证一定能够实现。
3. pthread_setconcurrency 参数为 0 时,并发等级并不改变。
4. pthread_getconcurrency 返回原来由 pthread_setconcurrency 设置的值。如果在这之前没有调用过pthread_setconcurrency 函数,pthread_getconcurrency 函数将返回0,这表示由线程库维护并发级别。



















先来讲说线程内存相关的东西,主要有下面几条:

  • 进程中的所有的线程共享相同的地址空间。

  • 任何声明为static/extern的变量或者堆变量可以被进程内所有的线程读写。

  • 一个线程真正拥有的唯一私有储存是处理器寄存器。

  • 线程栈可以通过暴露栈地址的方式与其它线程进行共享。

     有大数据量处理的应用中,有时我们有必要在栈空间分配一个大的内存块或者要分配很多小的内存块,但是线程的栈空间的最大值在线程创建的时候就已经定下来了,如果栈的大小超过个了个值,系统将访问未授权的内存块,毫无疑问,再来的肯定是一个段错误。可是没办法,你还是不得不分配这些内存,于是你开会为分配一个整数值而动用malloc这种超级耗时的操作。当然,在你的需求可以评估的情况下,你的需求还是可以通过修改线程的栈空间的大小来改变的。

下面的我们用pthread_attr_getstacksizepthread_attr_setstacksize的方法来查看和设置线程的栈空间。

继承事业,薪火相传
返回列表