线程属性:

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线程属性,让线程以分离状态启动

Linux下多线程的重要知识点的更多相关文章

  1. [转载]解决linux 下多线程错误 undefined reference to `sem_init'

    转自:https://blog.csdn.net/yzycqu/article/details/7396498?utm_source=copy 解决linux 下多线程错误 undefined ref ...

  2. Linux下多线程下载工具 - Axel

    Axel 是 Linux 下一个不错的HTTP/FTP高速下载工具.支持多线程下载.断点续传,且可以从多个地址或者从一个地址的多个连接来下载同一个文件.适合网速不给力时多线程下载提高下载速度.比如在国 ...

  3. Linux下多线程编程

    一.为什么要引入线程? 使用多线程的理由之一是和进程相比,它是一种非常"节俭"的多任务操作方式.在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维 ...

  4. Axel linux下多线程下载工具

    Axel 是 Linux 下一个不错的HTTP/FTP高速下载工具.支持多线程下载.断点续传,且可以从多个地址或者从一个地址的多个连接来下载同一个文件.适合网速不给力时多线程下载提高下载速度.比如在国 ...

  5. Linux下多线程编程遇到的一些问题

    今天在学习了Linux的多线程编程的基础的知识点.于是就试着做了一个简单的Demo.本以为会得到预期的结果.不成想却遇到了意想不到的问题. 代码展示 我的C 代码很简单,就是一个简单的示例程序,如下: ...

  6. Linux下多线程下载工具myget

    [root@superdba ~]# mytgetMytget 0.0.99: A download accelerator for GNU/LinuxUsage: mytget [options]. ...

  7. linux下多线程断点下载工具-axel

    今天要下载一下14G左右的文件,用wget约10小时,后来发现linux下有个多线程支持断点续传的下载工具axel,试了一下,下载速度大大增加. 包地址:http://pkgs.repoforge.o ...

  8. Linux下多线程复制文件(C)

    Linux下实现多线程文件复制,使用<pthread.h>提供的函数: int pthread_create(pthread_t *thread,const pthread_attr_t ...

  9. linux下多线程互斥量实现生产者--消费者问题和哲学家就餐问题

    生产者消费者问题,又有界缓冲区问题.两个进程共享一个一个公共的固定大小的缓冲区.其中一个是生产者,将信息放入缓冲区,另一个是消费者,从缓冲区中取信息. 问题的关键在于缓冲区已满,而此时生产者还想往其中 ...

随机推荐

  1. http协议之报文详解

    一. 概述 用于HTTP协议交互的信息被称为HTTP报文.请求端(客户端)的http报文叫做请求报文,响应端的叫做响应报文. 报文,是网络中交换和传输的数据单元,即站点一次性要发送的数据块.报文包含了 ...

  2. URLDecoder: Incomplete trailing escape (%) pattern问题处理

    http://blog.csdn.net/yangbobo1992/article/details/10076335 _________________________________________ ...

  3. 模板题 + KMP + 求最小循环节 --- HDU 3746 Cyclic Nacklace

    Cyclic Nacklace Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=3746 Mean: 给你一个字符串,让你在后面加尽 ...

  4. 回文树(统计所有回文串的个数) - MCCME 1750 Подпалиндромы

    Подпалиндромы Problem's Link: http://informatics.mccme.ru//mod/statements/view.php?chapterid=1750# M ...

  5. git 删除分之以及删除文件夹

    1.删除分支 1.1查看所有分支: git branch -a 得到结果: 1.2删除HEAD分支 git push origin --delete HEAD 2.删除文件夹 2.1 查看本地分支下的 ...

  6. linux 测试工具

    最近在寻找linux的测试工具,试用了一些.记录如下. memtester 内存测试工具,通过对内存进行读写进行测试.可以对同一块空间进行多次的读写. 源码分析 http://www.cnblogs. ...

  7. java------HashMap与HashSet的区别

    HashMap和HashSet的区别是Java面试中最常被问到的问题.如果没有涉及到Collection框架以及多线程的面试,可以说是不完整.而Collection框架的问题不涉及到HashSet和H ...

  8. hmacSHA1

    import javax.crypto.Mac; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; publ ...

  9. [转]Linux动态库的种种要点

    linux下使用动态库,基本用起来还是很容易.但如果我们的程序中大量使用动态库来实现各种框架/插件,那么就会遇到一些坑,掌握这些坑才有利于程序更稳健地运行. 本篇先谈谈动态库符号方面的问题. 测试代码 ...

  10. RESTful作用与特性

    最近在项目中要使用rest风格的设计,学习了一下. 知乎网友说的一句话精确的解释了REST: URL定位资源,用HTTP动词(GET,POST,DELETE,DETC)描述操作-(https://ww ...