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