线程属性:

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. modSecurity和Naxsi哪个更适合Nginx搭建WAF

    nginx增加modsecurity模块 modsecurity原本是Apache上的一款开源waf,可以有效的增强web安全性,目前已经支持nginx和IIS,配合nginx的灵活和高效,可以打造成 ...

  2. 如果将一个类设置为abstract,则此类必须被继承使用

    利用final定义方法:这样的方法为一个不可覆盖的方法. Public final void print(){}: 为了保证方法的一致性(即不被改变),可将方法用final定义. 如果在父类中有fin ...

  3. Android开发人员必备的10个开发工具

    工欲善其事,必先利其器,Android SDK 本身包含很多帮助开发人员设计.开发.测试和发布 Android 应用的工具,在本文中,我们将讨论 10 个最常用的工具. 1.Eclipse ADT E ...

  4. 【vijos】1006 晴天小猪历险记之Hill(dijkstra)

    https://vijos.org/p/1006 连边后跑点权的最短路 注意连边的时候左端点可以连到下一行的右端点,右端点可以连到下一行的左端点 #include <cstdio> #in ...

  5. hdu 1233 还是畅通project

    本题链接:点击打开链接 本题大意: 有n个村庄,n*(n-1)/2条路,输入每条路所连接是哪两个村庄及长度,求使全部村庄均连通(并不是都两两连通) 所铺公路的最短路程. 解题思路: 使用并查集基础及K ...

  6. bootstrap基础学习五篇

    bootstrap表格 Bootstrap 提供了一个清晰的创建表格的布局.下表列出了 Bootstrap 支持的一些表格元素: 标签 描述 <table> 为表格添加基础样式. < ...

  7. sdut 2154:Shopping(第一届山东省省赛原题,水题)

    Shopping Time Limit: 1000MS Memory limit: 65536K 题目描述 Saya and Kudo go shopping together.You can ass ...

  8. 浅谈AutoResetEvent的用法

    using System;using System.Threading; namespace AutoResetEvent_Examples{    class MyMainClass    {    ...

  9. VS工程目录下的ipch文件夹和.sdf文件

    Visual Studio 2010工程目录下的ipch文件夹和.sdf文件 - web8 - 博客园http://www.cnblogs.com/web100/archive/2012/12/21/ ...

  10. 一个格式化字符串的函数ToString

    A Formatting String Function  原文:http://flounder.com/tostring.htm CString ToString(LPCTSTR fmt, ...) ...