线程属性:

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. 【基础练习】【区间DP】codevs2102 石子归并2(环形)题解

    题目描写叙述 Description 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次仅仅能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个 ...

  2. Spring MVC添加支持Http的delete、put请求!(HiddenHttpMethodFilter)

    浏览器form表单只支持GET与POST请求,而DELETE.PUT等method并不支持,spring3.0添加了一个过滤器,可以将这些请求转换为标准的http方法,使得支持GET.POST.PUT ...

  3. senfile函数实例的运行过程截图

    //要传输的文件内容如下所示: 启动服务器,等待客户端连接(在同一台主机上模拟的) 客户端远程登录,这里是在本地登录 这个要注意一点就是远程登陆的时候一定要带上端口号不然连接失败!!

  4. 编译Spark2.1.2源码

    源码编译的shell脚本为 /dev/make-distribution.sh ,下载源码包解压就能找到.不同版本使用的参数有差异.可以直接查看make-distribution.sh文件. 下载sp ...

  5. SpringBoot使用maven构建

    1.使用maven作为parent管理 maven用户可以继承spring-boot-starter-parent项目获取合适的默认设置.该父项目提供一下特性: 默认编译级别为Java1.6 源编码格 ...

  6. 个别图片IE中无法显示问题

    今天有人保障,某些图片在IE下无法打开,但是其他浏览器均没有问题.以前还真没遇到过这类问题,从上至下查看了一遍,能排除的因素基本都排除了,还是不知道为什么不能显示,真是奇怪了.最后注意到无法显示的图片 ...

  7. 获取checkbox 组成字符串

    <input type="checkbox" id="goods_server_name" name="goods_server_name[]& ...

  8. (转)内核container_of(ptr,type,member) 解析

     container_of(ptr,type,member) 用于在已知结构体里面成员member和该成员指针ptr(就是地址)和结构体类型type, 返回该成员所在的结构体的指针(就是地址), 例如 ...

  9. hdu 2141:Can you find it?(数据结构,二分查找)

    Can you find it? Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/10000 K (Java/Others ...

  10. Spring学习笔记--使用注解装配

    使用@Autowired注解 从Spring2.5开始,最有趣的一种装配Spring Bean的方式是使用注解自动装配Bean的属性.Spring默认禁用注解装配,最简单的启用方式是使用Spring的 ...