linux线程属性

pthread_create()函数的第二个参数(pthread_attr_t *attr)表示线程的属性,在以前的例子中将其值设为NULL,也就是采用默认属性,线程的多项属性都是可以修改的,这些属性包括绑定属性,分离属性,堆栈属性,堆栈大小,优先级。系统默认的是非绑定,非分离,缺省1M的堆栈以及父子进程优先级相同。

(1)绑定属性

linux中采用一对一的线程机制,也就是一个用户线程对应一个内核线程,绑定属性就是指一个用户线程固定的分配给一个内核线程,cpu的时间片的调度是面向内核线程的(也就是轻量级进程),所以具有绑定属性的线程可以保证在需要的时候总有一个内核线程与之对应,非绑定属性就是指用户线程和内核线程的关系不是始终固定的,有系统控制分配的。

(2)分离属性

分离属性用来决定一个线程用什么样的方式终止自己,在非分离的情况下,当一个线程终止时他的系统资源并没有被释放,也就是没有真正的终止,只有当pthread_join()返回时创建的线程才能释放自己占用的系统资源,而在分离属性属性情况下,一个线程结束时立即释放他锁占用的系统资源,

ps:如果设置了一个线程的分离属性,而这个线程运行非常快的话,可能在pthread_create()返回前就终止了,此时他的线程号和系统资源就分配给了别的线程,此时调用pthread_create()获得的线程号就是错误的。

pthread_attr_init():初始化线程属性结构体

pthread_attr_destroy():对分配的属性结构指针进行清理和回收

pthread_attr_setscope():设置绑定属性

pthread_attr_setdetachstate():设置线程分离属性

pthread_attr_getschedparam():获取线程优先级

pthread_attr_setschedparam():设置线程优先级

当设置好这些属性之后就可以调用pthread_create()创建线程了

pthread_attr_init()函数语法:

pthread_attr_setscope()函数语法:

pthread_attr_setdetachstate()函数语法:

pthread_attr_getschedparam():

pthread_attr_setschedparam():

下面实例使用了线程绑定和分离的例子:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define REPEAT_NUMBER 3
#define DELAY_TIME_LEVELS 10.0
int finish_flag = 0 ;
void *thrd_func(void *arg)
{
    int delay_time = 0 ;
    int count = 0 ;
    printf("thread is starting\n") ;
    for (count  = 0; count < REPEAT_NUMBER; count++)
    {
        delay_time = (int)(rand() * DELAY_TIME_LEVELS/(RAND_MAX)) + 1;
        sleep(delay_time) ;
        printf("\tThread job %d delay = %d\n", count, delay_time) ;
    }
    printf("thread finished\n") ;
    finish_flag = 1 ;
    pthread_exit(NULL) ;
}
int main()
{
    pthread_t thread ;
    pthread_attr_t attr ;//线程属性结构体
    int no = 0, res ;
    void *thrd_ret ;
    srand(time(NULL)) ;
    res = pthread_attr_init(&attr) ;//初始化结构体
    if (res != 0)
    {
        printf("create attribute failed\n") ;
        exit(res) ;
    }
    res = pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM) ;//设置绑定属性
    res += pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) ;//设置分离属性
    if (res != 0)
    {
        printf("setting attribute failed\n") ;
        exit(res) ;
    }
    res = pthread_create(&thread, &attr, thrd_func, NULL) ;
    if (res != 0)
    {
        printf("create thread %d failed\n", no) ;
        exit(res) ;
    }
    pthread_attr_destroy(&attr) ;//释放线程属性对象
    printf("create threads success\n") ;
    while(!finish_flag)
    {
        printf("waitting for thread to finish...\n") ;
        sleep(2) ;
    }
    return 0 ;
}

程序由于设定了绑定属性所以不需要调用pthread_join()来释放所占用的系统资源,通过设置一个全局变量finish_flag来看线程是否执行完毕,当执行完毕了线程占用的资源也就释放了。通过free命令看一下内存的使用情况:

程序运行前:

程序运行中:

程序运行后:

问题:主要看这个used选项的情况,但发现这个程序运行前后used不一样呀,这是个问题,我不知道为什么???

本来应该是一样的,才能说明占用的内存被成功释放了。


  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值