加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

linux网络编程之posix 线程(二)

发布时间:2016-01-21 03:33:18 所属栏目:Linux 来源:网络整理
导读:线程的属性和 线程特定数据 Thread-specific Data 一、posix 线程属性 POSIX 线程库定义了线程属性对象 pthread_attr_t ,它封装了线程的创建者可以访问和修改

进程的调度策略和优先级属于主线程,换句话说就是设置进程的调度策略和优先级只 会影响主线程的调度策略和优先级,而不会改变对等线程的调度策略和优先级(注这句话不完全正确)。每个对等线程可以拥有它自己的独立于主线程的调度策略和优先级。

在 Linux 系统中,进程有三种调度策略:SCHED_FIFO、SCHED_RR 和 SCHED_OTHER,线程也不例外,也具有这三种策略。

在 pthread 库中,提供了一个函数,用来设置被创建的线程的调度属性:是从创建者线 程继承调度属性(调度策略和优先级),还是从属性对象设置调度属性。该函数就是:

int pthread_attr_setinheritsched (pthread_attr_t *   attr, int    inherit) 其中,inherit 的值为下列值中的其一:

enum

{

PTHREAD_INHERIT_SCHED, //线程调度属性从创建者线程继承

PTHREAD_EXPLICIT_SCHED //线程调度属性设置为 attr 设置的属性

};

如果在创建新的线程时,调用该函数将参数设置为 PTHREAD_INHERIT_SCHED 时,那么当修改进程的优先级时,该进程中继承这个优先级并且还没有改变其优先级的所 有线程也将会跟着改变优先级(也就是刚才那句话部正确的原因)。

下面写个程序测试一下:

#include <unistd.h>
#include <sys/types.h>
#include <pthread.h>
    
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
    
#define ERR_EXIT(m) 
        do 
        { 
                perror(m); 
                exit(EXIT_FAILURE); 
        } while(0)
    
int main(void)
{
    pthread_attr_t attr;
    pthread_attr_init(&attr);
    
    int state;
    pthread_attr_getdetachstate(&attr, &state);
    if (state == PTHREAD_CREATE_JOINABLE)
        printf("detachstate:PTHREAD_CREATE_JOINABLEn");
    else if (state == PTHREAD_CREATE_DETACHED)
        printf("detachstate:PTHREAD_CREATE_DETACHED");
    
    size_t size;
    pthread_attr_getstacksize(&attr, &size);
    printf("stacksize:%dn", size);
    
    pthread_attr_getguardsize(&attr, &size);
    printf("guardsize:%dn", size);
    
    int scope;
    pthread_attr_getscope(&attr, &scope);
    if (scope == PTHREAD_SCOPE_PROCESS)
        printf("scope:PTHREAD_SCOPE_PROCESSn");
    if (scope == PTHREAD_SCOPE_SYSTEM)
        printf("scope:PTHREAD_SCOPE_SYSTEMn");
    
    
    int policy;
    pthread_attr_getschedpolicy(&attr, &policy);
    if (policy == SCHED_FIFO)
        printf("policy:SCHED_FIFOn");
    else if (policy == SCHED_RR)
        printf("policy:SCHED_RRn");
    else if (policy == SCHED_OTHER)
        printf("policy:SCHED_OTHERn");
    
    
    int inheritsched;
    pthread_attr_getinheritsched(&attr, &inheritsched);
    if (inheritsched == PTHREAD_INHERIT_SCHED)
        printf("inheritsched:PTHREAD_INHERIT_SCHEDn");
    else if (inheritsched == PTHREAD_EXPLICIT_SCHED)
        printf("inheritsched:PTHREAD_EXPLICIT_SCHEDn");
    
    struct sched_param param;
    pthread_attr_getschedparam(&attr, &param);
    printf("sched_priority:%dn", param.sched_priority);
    
    
    pthread_attr_destroy(&attr);
    
    return 0;
}

在调用各个函数设置线程属性对象的属性时需要先调用pthread_attr_init 初始化这个对象,最后调用pthread_attr_destroy 销毁这个对象。

simba@ubuntu:~/Documents/code/linux_programming/UNP/pthread$ ./pthread_attr

detachstate:PTHREAD_CREATE_JOINABLE

stacksize:8388608

guardsize:4096

scope:PTHREAD_SCOPE_SYSTEM

policy:SCHED_OTHER

inheritsched:PTHREAD_INHERIT_SCHED

sched_priority:0

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读