zoukankan      html  css  js  c++  java
  • 【Linux 线程】常用线程函数复习《四》

    1、线程属性的设置

     1 /*************************************************************************
     2     > File Name: pthread_attr.c
     3     > Summary: 线程属性的设置---举例创建线程之时就设置线程分离
     4     > Author: xuelisheng 
     5     > Created Time: 2018年12月17日 
     6  ************************************************************************/
     7 
     8 #include <stdio.h>
     9 #include <stdlib.h>
    10 #include <string.h>
    11 #include <unistd.h>
    12 #include <errno.h>
    13 #include <pthread.h>
    14 
    15 void *tfn(void *arg)
    16 {
    17     printf("thread : pid = %d,  tid = %lu
    ", getpid(), pthread_self());
    18     return  NULL;        
    19 }
    20 
    21 
    22 int main()
    23 {
    24     pthread_t tid;
    25     // 属性结构体
    26     pthread_attr_t attr;
    27 
    28     int ret = pthread_attr_init(&attr);
    29     if(ret != 0){
    30         fprintf("stderr", "attr_init error:%s
    ", strerror(ret));
    31         exit(1);
    32     }
    33 
    34     // 设置线程属性
    35     ret = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
    36     if(ret != 0){
    37         fprintf("stderr", " pthread_attr_setdetachstate error:%s
    ", strerror(ret));
    38         exit(1);
    39     }
    40     //ret = pthread_create(&tid, &attr, tfn, NULL);
    41     ret = pthread_create(&tid, NULL, tfn, NULL);
    42     if(ret != 0){
    43         perror("pthread_create error");
    44     }
    45 
    46     // 销毁
    47     ret = pthread_attr_destroy(&attr);
    48     if(ret != 0){
    49         fprintf("stderr", " pthread_attr_destroy error:%s
    ", strerror(ret));
    50         exit(1);
    51     }
    52 
    53     ret = pthread_join(tid, NULL);                // 使用join函数用来验证detach属性是否生效,如果生效则返回值为无效
    54     if(ret != 0){
    55         fprintf("stderr", " pthread_join error:%s
    ", strerror(ret));
    56         exit(1);
    57     }
    58     printf("main : pid = %d,  tid = %lu
    ", getpid(), pthread_self());
    59     pthread_exit((void *)0);
    60     return 0;
    61 }

    运行结果:

    pthread_join error : Invalid argument

    关于上面的demo:

    (1)上面的功能实际上可以直接通过使用pthread_detach实现,但是如果创建线程较多,则可以直接在创建线程时直接设置分离属性。

    (2)随着一个进程中的线程的数量增多,进程中的栈资源均分的更少,此时可以设置线程属性,来进行堆上空间的开辟,这也是进行线程属性设置的一个应用。

    2、线程使用的总结

    (1)主线程退出而其他线程不退出,主线程应该调用pthread_exit。

    (2)避免僵尸线程:pthread_join、pthread_detach、pthread_create指定分离属性

                                      被join线程可能在join函数返回前就释放自己的所有内存资源,所以不应该返回被回收线程栈中的值。

    (3)malloc申请的内存可以被其他线程释放(共享)。

    (4)应避免在多线程模型中调用fork,除非立即exec。fork出的子进程中只有调用fork的线程存在,其他线程在子进程中均pthread_exit。

    (5)信号的复杂语义很难和多线程共存,所以应避免在多线程中引入信号机制。

  • 相关阅读:
    zoj 3279 线段树 OR 树状数组
    fzu 1962 树状数组 OR 线段树
    hdu 5057 块状链表
    hdu3487 Play with Chain
    bzoj 1588营业额统计(HNOI 2002)
    poj2823 Sliding Window
    poj2828 Buy Tickets
    poj2395 Out of Hay
    poj3667 Hotel
    poj1703 Lost Cows
  • 原文地址:https://www.cnblogs.com/xuelisheng/p/10130367.html
Copyright © 2011-2022 走看看