线程2

  1. 获取线程ID

    • pthread_t pthread_self(void);
    • 返回当前线程ID
  2. 比较线程ID是否相等

    • int pthread_equal(pthread_t t1, pthread_t t2);
    • 如果是同一线程返回0,不是-1
    • pthread_t不一定是 unsigned long类型的,有些系统中是结构体类型,所以比用 == 比较
  3. 线程终止

    • void pthread_exit(void *retval);
    • 功能:调用者线程结束(从入口函数return,主函数也能退出)
    • retval:会返回给pthread_join函数的第二个参数(返回值)
    • 注意:如果是进程的最后一个线程,当调用这个函数时也将退出。
  4. 线程分离和联合

    1. 非分离(联合态)线程可以被创建者调用pthread_join等待(回收资源)

    2. 分离,线程不可被调用者等待,线程结束后自动释放资源

      • int pthread_detach(pthread_t thread);
      • 功能:使调用者线程与线程ID为thread的线程成为分离状态
      • 例子
            #include <stdio.h>
            #include <unistd.h>
            #include <pthread.h>
            void* start_run(void* arg)
            {
                char* str = "分手!";//生成在代码段
                //char str[] = "dididi";生成在线程的栈,线程结束后数据销毁无法返回
                return str;
            }
            int main(
            {
                pthread_t pid;
                pthread_create(&pid,NULL,start_run,NULL);
                void* ptr = NULL;
                pthread_detach(pid);
                pathread_join(pid,&ptr);
                printf("%s 不要\n",(char*)ptr);//不会有回应
            }
    
  5. 线程的取消

    • int pthread_cancel(pthread_t thread);
    • 功能:向指定线程发送结束信号,(对方不一定响应,不响应,不结束)
        #include <stdio.h>
        #include <unistd.h>
        #include <pthread.h>
        void* start_run(void* arg)
        {
            while(1)
            {
                int pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
                char* str = "分手!";//生成在代码段
                printf("886\n");
            }
        }
        int main(
        {
            pthread_t pid;
            pthread_create(&pid,NULL,start_run,NULL);
            void* ptr = NULL;
            pthread_cancel(pid);
            pathread_join(pid,&ptr);//只打印一句
        }
    
        int pthread_setcancelstate(int state, int *oldstate);
    
    • 功能:设置当前调用者线程是否响应
    • oldstate:获取旧的状态
    • state
      • PTHREAD_CANCEL_ENABLE:允许线程响应
      • PTHREAD_CANCEL_DISABLE:不允许线程响应
  6. 设置线程属性

        typedef union
        {
            char __size[__SIZEOF_PTHREAD_T];
            long int __align;
        }pthread_attr_t;
    
    
    1. 初始化一个线程对象的属性

      • int pthread_attr_init(pthread_attr_t *attr);
      • 返回值:若是成功返回0,否则返回错误的编号
      • 形 参:
      • attr 指向一个线程属性的指针
      • 说 明:Posix线程中的线程属性pthread_attr_t主要包括scope属性、detach属性、堆栈地址、堆栈大小、优先级。pthread_attr_init实现时为属性对象分配了动态内存空间。
    2. 销毁一个线程属性对象

      • int pthread_attr_destroy(pthread_attr_t *attr);
      • 返回值:若是成功返回0,否则返回错误的编号
      • 形 参:
      • attr 指向一个线程属性的指针
      • 说 明:经pthread_attr_destroy去除初始化之后的pthread_attr_t结构被pthread_create函数调用,将会导致其返回错误。
    3. 获取线程间的CPU亲缘性

      • int pthread_attr_getaffinity_np(pthread_attr_t *attr, size_t cpusetsize, cpu_set_t *cpuset);
      • 返回值:若是成功返回0,否则返回错误的编号
      • 形 参:
      • attr 指向一个线程属性的指针
      • 说 明:获取线程的CPU亲缘属性
    4. 设置线程的CPU亲缘性

      • int pthread_attr_setaffinity_np(pthread_attr_t *attr, size_t cpusetsize, const cpu_set_t *cpuset);
      • 返回值:若是成功返回0,否则返回错误的编号
      • 形 参:
      • attr 指向一个线程属性的指针
      • cpusetsize 指向CPU组的缓冲区大小
      • cpuset 指向CPU组的指针
      • 说 明:通过指定cupset来设置线程的CPU亲缘性
    5. 获取线程分离状态属性

      • int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);
      • 返回值:若是成功返回0,否则返回错误的编号
      • 形 参:
      • attr 指向一个线程属性的指针
      • detachstate 保存返回的分离状态属性
      • 说 明:获取线程分离状态属性
    6. 修改线程分离状态属性

      • int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
      • 返回值:若是成功返回0,否则返回错误的编号
      • 形 参:
      • attr 指向一个线程属性的指针
      • detachstat 有两个取值
      • PTHREAD_CREATE_DETACHED(分离)
      • PTHREAD_CREATE_JOINABLE(非分离)
      • 说 明:Posix线程中的线程属性pthread_attr_t主要包括scope属性、detach属性、堆栈地址、堆栈大小、优先级。
    7. 获取线程的栈保护区大小

      • int pthread_attr_getguardsize(pthread_attr_t *attr, size_t *guardsize);
      • 返回值:若是成功返回0,否则返回错误的编号
      • 形 参:
      • attr 指向一个线程属性的指针
      • guardsize 返回获取的栈保护区大小
      • 说 明:获取线程的栈保护区大小
    8. 设置线程的栈保护区大小

      • int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);
      • 返回值:若是成功返回0,否则返回错误的编号
      • 形 参:
      • attr 指向一个线程属性的指针
      • guardsize 线程的栈保护区大小
      • 说 明:参数提供了对栈指针溢出的保护。默认为系统页大小如果设置为0表示没有保护区。大于0,则会为每个使用 attr 创建的线程提供大小至少为 guardsize 字节的溢出保护区
    9. 获取线程的作用域

      • int pthread_attr_getscope(pthread_attr_t *attr, int *scope);
      • 返回值:若是成功返回0,否则返回错误的编号
      • 形 参:
      • attr 指向一个线程属性的指针
      • scope 返回线程的作用域
      • 说 明:指定了作用域也就指定了线程与谁竞争资源
    10. 设置线程的作用域

      • int pthread_attr_setscope(pthread_attr_t *attr, int scope);
      • 返回值:若是成功返回0,否则返回错误的编号
      • 形 参:
      • attr 指向一个线程属性的指针
      • guardsize 线程的作用域,可以取如下值
      • PTHREAD_SCOPE_SYSTEM 与系统中所有进程中线程竞争
      • PTHREAD_SCOPE_PROCESS 与当前进程中的其他线程竞争
      • 说 明:指定了作用域也就指定了线程与谁竞争资源
    11. 获取线程的堆栈信息(栈地址和栈大小)

      • int pthread_attr_getstack(pthread_attr_t *attr, void **stackaddr, size_t *stacksize);
      • 返回值:若是成功返回0,否则返回错误的编号
      • 形 参:
      • attr 指向一个线程属性的指针
      • stackaddr 返回获取的栈地址
      • stacksize 返回获取的栈大小
      • 说 明:获取线程的堆栈地址和大小
    12. 设置线程堆栈区

      • int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize);
      • 返回值:若是成功返回0,否则返回错误的编号
      • 形 参:
      • attr 指向一个线程属性的指针
      • stackaddr 线程的堆栈地址:应该是可移植的,对齐页边距的(可以用posix_memalign来进行获取)
      • stacksize 线程的堆栈大小:应该是页大小的整数倍
      • 说 明:设置堆栈区,将导致pthread_attr_setguardsize失效。
    13. 获取线程堆栈地址

      • int pthread_attr_getstackaddr(pthread_attr_t *attr, void **stackaddr);
      • 返回值:若是成功返回0,否则返回错误的编号
      • 形 参:
      • attr 指向一个线程属性的指针
      • stackaddr 返回获取的栈地址
      • 说 明:函数已过时,一般用pthread_attr_getstack来代替
    14. 设置线程堆栈地址

      • int pthread_attr_setstackaddr(pthread_attr_t *attr, void *stackaddr);
      • 返回值:若是成功返回0,否则返回错误的编号
      • 形 参:
      • attr 指向一个线程属性的指针
      • stackaddr 设置线程堆栈地址
      • 说 明:函数已过时,一般用pthread_attr_setstack来代替
    15. 获取线程堆栈大小

      • int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);
      • 返回值:若是成功返回0,否则返回错误的编号
      • 形 参:
      • attr 指向一个线程属性的指针
      • stacksize 返回线程的堆栈大小
      • 说 明:获取线程堆栈大小
    16. 设置线程堆栈大小

      • int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
      • 返回值:若是成功返回0,否则返回错误的编号
      • 形 参:
      • attr 指向一个线程属性的指针
      • guardsize 线程的栈保护区大小:应该是页大小的整数倍
      • 说 明:设置线程堆栈大小:
    17. 获取线程的调度策略

      • int pthread_attr_getschedpolicy(pthread_attr_t *attr, int *policy);
      • 返回值:若是成功返回0,否则返回错误的编号
      • 形 参:
      • attr 指向一个线程属性的指针
      • policy 返回线程的调度策略
      • 说 明:获取线程的调度策略
    18. 设置线程的调度策略

      • int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
      • 返回值:若是成功返回0,否则返回错误的编号
      • 形 参:
      • attr 指向一个线程属性的指针
      • policy 线程的调度策略,有如下三种:
      • SCHED_FIFO 先入先出策略
      • SCHED_RR 轮转调度,类似于 FIFO,但加上了时间轮片算法
      • SCHED_OTHER 系统默认策略
      • 说 明:设置线程的调度策略
    19. 获取线程的调度参数

      • int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);
      • 返回值:若是成功返回0,否则返回错误的编号
      • 形 参:
      • attr 指向一个线程属性的指针
        -param 返回获取的调度参数,该结构仅有一个从参数,如下
      • 说 明:获取线程的调度参数
    20. 设置线程的调度参数

      • int pthread_attr_getschedparam(pthread_attr_t *attr, struct sched_param *param);
      • 返回值:若是成功返回0,否则返回错误的编号
      • 形 参:
      • attr : 指向一个线程属性的指针
      • param : 要设置的调度参数
      • 说 明:设置线程的调度参数
    21. 获取线程是否继承调度属性

      int pthread_attr_getinheritsched(pthread_attr_t *attr, int *inheritsched);

      • 返回值:若是成功返回0,否则返回错误的编号
      • 形 参:
      • attr : 指向一个线程属性的指针
      • inheritsched : 返回继承调度属性的设置
      • 说 明:获取线程是否继承调度属性
    22. 设置线程是否继承调度属性

      int pthread_attr_setinheritsched(pthread_attr_t *attr, int *guardsize);

      • 返回值:若是成功返回0,否则返回错误的编号
      • 形 参:
      • attr : 指向一个线程属性的指针
      • guardsize : 设置线程是否继承调度属性
      • PTHREAD_INHERIT_SCHED:调度属性将继承于正创建的线程,attr中的设置将被忽略
      • PTHREAD_EXPLICIT_SCHED : 调度属性将被设置为attr中指定的属性值
    • 使用方法
      1. 定义线程属性结构体
        • pthread_attr_t attr;
      2. 初始化属性结构体
        • pthread_attr_init(&attr);
      3. 使用设置线程属性的函数设置线程
      4. pthread_create函数的第二个参数中使用线程属性结构变量创建线程。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值