zoukankan      html  css  js  c++  java
  • 三十八、Linux 线程——线程属性初始化、销毁、设置和获得分离属性

    38.1 线程属性初始化和销毁

    1 #include <pthread.h>
    2 int pthread_attr_init(pthread_attr_t *attr);
    3 int pthread_attr_destroy(pthread_attr_t *attr);
    • 返回值:成功返回 0;否则,返回错误编号

      线程属性结构如下:

      

    38.2 设置和获得分离属性

    1 #include <pthread.h>
    2 int pthread_attr_getdetachstat(const pthread_attr_t *restrict attr,
    3                                              int *detachstate);
    4 int pthread_attr_setdetachstat(const pthread_attr_t *attr
    5                                              int detachstate);
    • detachstate 取值:
      • PTHREAD_CREATE_JOINABLE(默认值)         正常启动线程
        • 必须调用 pthread_join 才能释放线程占有的资源
      • PTHREAD_CREATE_DETACHED                    以分离状态启动线程
        • 可以不调用 pthread_join,在线程结束后,会自动释放占有的资源
    • 以默认方式启动的线程,在线程结束后不会自动释放占有的系统资源,要在主控线程中调用 pthread_join() 后才会释放。
    • 以分离状态启动的线程,在线程结束后会自动释放所占有的系统资源
    • 分离属性在网络通讯中使用的较多

    38.3 例子

     1 #include <stdio.h>
     2 #include <pthread.h>
     3 #include <stdlib.h>
     4 #include <unistd.h>
     5 
     6 void out_state(pthread_attr_t *attr)
     7 {
     8     int state;
     9     if(pthread_attr_getdetachstate(attr, &state) != 0){
    10         perror("getdetachstate error");
    11     }
    12     else{
    13         if(state == PTHREAD_CREATE_JOINABLE){
    14             printf("joinable state
    ");
    15         }
    16         else if(state == PTHREAD_CREATE_DETACHED){
    17             printf("detached state
    ");
    18         }
    19         else {
    20             printf("error state
    ");
    21         }
    22     }
    23 }
    24 
    25 void *th_fn(void *arg)
    26 {
    27     int i;
    28     int sum = 0;
    29     for(i = 1; i <= 100; i++){
    30         sum += i;
    31     }
    32     return (void *)sum;
    33 }
    34 
    35 
    36 int main(void)
    37 {
    38     int err;
    39     pthread_t   default_th, detach_th;
    40 
    41     /** 定义线程属性 */
    42     pthread_attr_t attr;
    43     /** 对线程属性初始化 */
    44     pthread_attr_init(&attr);
    45     /** 输出分离属性 */
    46     out_state(&attr);
    47 
    48     /** 取分离属性的默认值,以正常方式启动子线程 */
    49     if((err = pthread_create(&default_th, &attr, th_fn, (void *)0)) != 0) {
    50         perror("pthread create perror");
    51     }
    52     int res;
    53     if((err = pthread_join(default_th, (void *)&res)) != 0){
    54         perror("pthread join error");
    55     }
    56     else {
    57         printf("default return is %d
    ", (int )res);
    58     }
    59     printf("-------------------------------------------------
    ");
    60 
    61 
    62     /** 以分离状态启动子线程 */
    63     /** 设置分离属性 */
    64     pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
    65     out_state(&attr);
    66     if((err = pthread_create(&detach_th, &attr, th_fn, (void *)0)) != 0) {
    67         perror("pthread create perror");
    68     }
    69     if((err = pthread_join(detach_th, (void *)&res)) != 0){
    70         perror("pthread join error");
    71     }
    72     else {
    73         printf("detach is %d
    ", (int )res);
    74     }
    75 
    76     /** 销毁线程属性 */
    77     pthread_attr_destroy(&attr);
    78     printf("0x%lx finished
    ", pthread_self());
    79     sleep(1);
    80 
    81     return 0;
    82 }

      在例子中,对分离状态的线程使用 pthread_join 进行回收,编译运行结果:

      

      第 70 行报了错误,但是依然是成功,改用 fprintf 进行错误码输出:

      

      修改后,运行结果:

      

      说明 join 函数并没有调用到返回值,分离的线程已经自动释放了

  • 相关阅读:
    如何设置eclipse默认打开文件方式
    CalendarUtil.java
    排班管理
    jquery ajax 发送邮件例子
    C# 打开文件夹和保存文件夹
    C# QQ邮箱授权码发送邮件
    IIS7 http自动跳转到https
    C# 关键字替换
    C# webBrowser 控件赋值
    C# Post提交数据
  • 原文地址:https://www.cnblogs.com/kele-dad/p/10205922.html
Copyright © 2011-2022 走看看