• Linux下多线程的重要知识点


    线程属性:

    typedef struct

    {

           int                              detachstate;   线程的分离状态

           int                              schedpolicy;  线程调度策略

           struct sched_param           schedparam;  线程的调度参数

           int                              inheritsched;  线程的继承性

           int                               scope;       线程的作用域

           size_t                          guardsize;   线程栈末尾的警戒缓冲区大小

           int                               stackaddr_set;

           void *                         stackaddr;   线程栈的位置

           size_t                          stacksize;    线程栈的大小

    }pthread_attr_t;

     

    一、线程分离状态可设置为分离

    总之为了在使用 pthread 时避免线程的资源在线程结束时不能得到正确释放,从而避免产生潜在的内存泄漏问题,在对待线程结束时,要确保该线程处于 detached 状态,否着就需要调用 pthread_join() 函数来对其进行资源回收。

    线程是可结合的 (joinable),或者是分离的(detached)

    所以如果我们在创建线程时就知道不需要了解线程的终止状 态,则可以pthread_attr_t结构中的detachstate线程属性,让线程以分离状态启动

    二、互斥锁属性
    //获得或设置互斥锁的pshared属性
    int pthread_mutexattr_getpshared(const pthread_mutexattr_t* attr, int *pshared);
    int pthread_mutexattr_setpshared(const pthread_mutexattr_t* attr, int *pshared);
    //获得或设置互斥锁的type属性
    int pthread_mutexattr_gettype(const pthread_mutexattr_t* attr, int *type); 

     

    int pthread_mutexattr_settype(const pthread_mutexattr_t* attr, int *type);
    这是互斥锁常用的两个属性,pshared和type,
    pshared指定是否允许跨进程共享互斥锁,其可选值有两个
    PTHREAD_PROCESS_SHARED        可以被跨进程共享
    PTHREAD_PROCESS_PRIVATE        只能被和锁初始化线程隶属于同一进程的线程共享
    type指定互斥锁的类型,LINUX支持4中类型的互斥锁
    PTHREAD_MUTEX_NORMAL                普通锁,一个进程如果对一个已经加锁的普通锁再次加锁会造成死锁
    PTHREAD_MUTEX_ERRORCHECK      检错锁,对一个已经加锁的锁进行加错会返回EDEADLK,对一个已解锁的解锁会返回EPERM
    PTHREAD_MUTEX_RECURSIVE           嵌套锁,对一个已经加锁的锁进行加锁不会造成死锁,按次序解锁即可,对一个已解锁的解锁会                  
                                                                                返回EPERM(尽量设置 recursive 属性以初始化 Linux 的互斥变量)    
    PTHREAD_MUTEX_DEFAULT                默认锁,不经常使用
    三、条件变量
    int pthread_cond_broadcast(pthread_cond_t* cond)        以广播的形式唤醒所有等待目标条件变量的线程
    int pthead_cond_wait(pthread_cond_t* cond, pthread_mutex_t* mutex) 唤醒一个等待目标的条件变量,取决于线程的优先级以调度策略 
            mutex 是用于保护条件变量的互斥锁,以确保pthread_cond_wait的操作原子性,在调用wait函数前必须确保互斥锁已经加锁
    四、线程安全
    如果在多线程并发执行的情况下,一个函数可以安全地被多个线程并发调用,可以说这个函数是线程安全的。
    详情请参看:http://www.cnblogs.com/xyxxs/p/4655692.html
     
    Linux 线程编程中的 5 条经验:
    1.设置互斥锁的属性为,嵌套锁
    2.Linux 平台上触发条件变量的后没有条件变量在等待时,触发信号会自动复位问题,所以建议在发送触发信号前判断是否有人在等待。!
    3.注意条件返回时互斥锁的解锁问题,pthread_cond_wait之前需要加锁,返回之后需要解锁
        pthread_mutex_lock(&taxiMutex); 
        pthread_cond_wait (&taxiCond, &taxtMutex); 
        pthread_mutex_unlock (&taxtMutex); 
    4.等待的绝对时间问题,
    int pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, 
                                const struct timespec *restrict abstime);
    .pthread_cond_timedwait函数设置条件变量最多只被阻塞指定的时间间隔,然而该参数是一个绝对时间,而不是相对时间,
    /* get the current time */ 
        struct timeval now; 
        gettimeofday(&now, NULL); 
    	
        /* add the offset to get timeout value */ 
        abstime ->tv_nsec = now.tv_usec * 1000 + (dwMilliseconds % 1000) * 1000000; 
        abstime ->tv_sec = now.tv_sec + dwMilliseconds / 1000;
    所以必须将相对时间转换为绝对时间
    5.如果我们在创建线程时就知道不需要了解线程的终止状 态,则可以pthread_attr_t结构中的detachstate线程属性,让线程以分离状态启动
  • 相关阅读:
    分享
    分享
    分享
    分享
    基于加权相似度的相关性排序算法的研究 中国学术期刊网络出版总库
    分享
    基于用户点击行为的数字图书搜索系统研究与实现 中国优秀硕士学位论文全文数据库
    分享
    垂直搜索引擎分类索引系统的设计与实现 中国优秀硕士学位论文全文数据库
    基于相关反馈技术的检索结果排序模型研究 中国优秀硕士学位论文全文数据库
  • 原文地址:https://www.cnblogs.com/xyxxs/p/4655721.html
Copyright © 2020-2023  润新知