线程:轻量级进程,在资源、数据方面不需要进行复制

不间断地跟踪指令执行的路径被称为执行路线

进程的结构:task_struck;地址空间

线程:轻量级的进程

在同一个进程中创建的线程,在共享进程的地址空间

在linux里用task_struct来描述一个线程,进程和线程都参与统一的调度

线程是共享相同地址空间的多个任务

------------------------------------------------------------------------------------

一个进程中的多个线程共享以下资源:

1.代码段/指令

** 2.静态数据(全局变量、静态变量)

3.进程中打开的文件描述符

4.信号处理函数

5.当前工作目录

6.用户id:uid

7.组id:gid

每个线程私有的资源如下:

1.线程id:tid

2.程序计数器(PC)和寄存器

** 3.栈/堆栈(stack):局部变量

4.错误码(errno)

5.信号掩码

6.执行状态和属性

-----------------------------------------------------------------------------------------------

创建线程:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);

thread:创建的线程的id号

attr:指定线程的属性,NULL-----表示使用缺省属性,默认

start_routine:线程执行的函数

void *(*start_routine) (void *)--------------参数和返回值都被定义为类型是void*的指针,以允许他们指向任何类型的值

arg:传递给线程执行的函数的参数

删除线程/线程退出:

void pthread_exit(void *retval);

retval:线程退出时,返回值的地址

控制线程:等待一个线程结束/以阻塞的方式等待线程的结束

int pthread_join(pthread_t thread, void **retval);

thread:要等待的进程

retval:指向线程返回值的地址,不需要的话---NULL

======================================================================================================

|    在进行多线程编程时,一般主线程初始化/创建其他线程后,不做任何操作,调用pthread_join等待线程结束 |

| 因为若主线程有操作的话,可能因为操作失误而关闭进程,这样就会影响其他的线程操作                   |

======================================================================================================

线程间互斥和同步:

----------------------------------------------------------------------------------------------------------------------------------------------------

线程间同步(条件变量):

条件变量是线程的一种同步机制。

条件变量给多个线程提供一个汇合的场所

条件变量是公共资源,条件变量与互斥锁一起使用,允许线程以没有竞争的方式等待特定的条件发生。

条件变量是由互斥锁进行保护的。线程在改变条件变量的状态之前,必须先锁住互斥锁。

初始化条件变量:

int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr);

attr---->条件变量的属性

NULL---->默认属性

或者

pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

等待条件变量:

int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);

功能:1.先解锁

2.暂停该线程

唤醒条件变量:

int pthread_cond_signal(pthread_cond_t *cond);

功能:使一个由cond阻塞的线程运行

-----------------------------------------------------------------------------------------------------------------------------------------------------------

线程间互斥:引入互斥锁(mutual exclusion)目的是用来保证共享数据操作的完整性和正确性

互斥锁:主要用来保护临界资源。每个临界资源都由一个互斥锁来保护,任何时候最多只有一个线程能访问临界资源。进程必须要先获得互斥锁才能访问临界资源,访问完临界资源后释放互斥锁。如果无法获得互斥锁,线程就会阻塞/等待,直到获得锁为止。

初始化互斥锁:int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);

mutex----------互斥锁

attr----------互斥锁的属性,NULL---表示缺省/默认属性

或者

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

加锁:等待互斥锁解开然后再锁住互斥锁

int pthread_mutex_lock(pthread_mutex_t *mutex);

解锁:int pthread_mutex_unlock(pthread_mutex_t *mutex);

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

信号量:bijkstra算法

信号量也是一种同步的机制

由信号量来决定线程是继续运行还是阻塞等待

信号量代表一类资源,他的值表示系统中该资源的数量

信号量是受保护的变量,只能通过函数来访问

初始化信号量:

int sem_init(sem_t *sem, int pshared, unsigned int value);

sem:初始化的信号量

pshared:信号量的共享范围,0-----线程之间   !0------进程之间

value:信号量的初始值

申请资源( P 操作):

if(信号量 > 0)

{

信号量-1;

申请资源的任务继续运行;

}else

{

申请资源的任务阻塞等待;

}

int sem_wait(sem_t *sem);

int sem_trywait(sem_t *sem);

int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);

释放资源( V 操作):

if(没有任务等待资源)

{

信号量+1;

}else

{

唤醒第一个等待的任务,让这个任务继续运行;

}

int sem_post(sem_t *sem);   //唤醒信号量

---------------------------------------------------------------------------------------------------------------------------------------------

Posix 定义的信号量:

**   无名信号量

有名信号量

linux线程的更多相关文章

  1. [转载]Linux 线程实现机制分析

    本文转自http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/ 支持原创.尊重原创,分享知识! 自从多线程编程的概念出现在 Linux ...

  2. linux线程的实现

    首先从OS设计原理上阐明三种线程:内核线程.轻量级进程.用户线程 内核线程 内核线程就是内核的分身,一个分身可以处理一件特定事情.这在处理异步事件如异步IO时特别有用.内核线程的使用是廉价的,唯一使用 ...

  3. linux线程的实现【转】

    转自:http://www.cnblogs.com/zhaoyl/p/3620204.html 首先从OS设计原理上阐明三种线程:内核线程.轻量级进程.用户线程 内核线程 内核线程就是内核的分身,一个 ...

  4. Linux线程-创建

    Linux的线程实现是在内核以外来实现的,内核本身并不提供线程创建.但是内核为提供线程[也就是轻量级进程]提供了两个系统调用__clone()和fork (),这两个系统调用都为准备一些参数,最终都用 ...

  5. Linux线程学习(一)

    一.Linux进程与线程概述 进程与线程 为什么对于大多数合作性任务,多线程比多个独立的进程更优越呢?这是因为,线程共享相同的内存空间.不同的线程可以存取内存中的同一个变量.所以,程序中的所有线程都可 ...

  6. Linux线程学习(二)

    线程基础 进程 系统中程序执行和资源分配的基本单位 每个进程有自己的数据段.代码段和堆栈段 在进行切换时需要有比较复杂的上下文切换   线程 减少处理机的空转时间,支持多处理器以及减少上下文切换开销, ...

  7. Linux 线程(进程)数限制分析

    1.问题来源公司线上环境出现MQ不能接受消息的异常,运维和开发人员临时切换另一台服务器的MQ后恢复.同时运维人员反馈在出现问题的服务器上很多基本的命令都不能运行,出现如下错误:2.   初步原因分析和 ...

  8. Linux 线程与进程,以及通信

    http://blog.chinaunix.net/uid-25324849-id-3110075.html 部分转自:http://blog.chinaunix.net/uid-20620288-i ...

  9. linux 线程的内核栈是独立的还是共享父进程的?

    需要考证 考证结果: 其内核栈是独立的 206 static struct task_struct *dup_task_struct(struct task_struct *orig) 207 { 2 ...

  10. Linux 线程模型的比较:LinuxThreads 和 NPTL

    Linux 线程模型的比较:LinuxThreads 和 NPTL GNU_LIBPTHREAD_VERSION 宏 大部分现代 Linux 发行版都预装了 LinuxThreads 和 NPTL,因 ...

随机推荐

  1. 浅谈Android样式开发之布局优化

    引言 今天我们来谈一下Android中布局优化常用的一些手段.官方给出了3种优化方案,分别是</include>.</viewstub>.</merge>标签,下面 ...

  2. iOS组件化思路 <转>

    随着应用需求逐步迭代,应用的代码体积将会越来越大,为了更好的管理应用工程,我们开始借助CocoaPods版本管理工具对原有应用工程进行拆分.但是仅仅完成代码拆分还不足以解决业务之间的代码耦合,为了更好 ...

  3. Java优先队列

    按照Java api的说法: java.util.PriorityQueue.PriorityQueue() Creates a PriorityQueue with the default init ...

  4. C#

    1.类型推导 ; Console.WriteLine(age.GetType().ToString()); var 关键字还可以配合生成匿名类型,如: , Time = }: 如果有可以将对象转成JS ...

  5. 一个ListView怎么展示两种样式

    private class MyBaseMsgAdapter extends BaseAdapter { //获取数据适配器中条目类型的总数,修改成两种(纯文本,输入+文字) @Override pu ...

  6. Toad各版本所包含的组件

    Toad for Oracle Base Edition Toad for Oracle Knowledge Xpert for PL/SQL Knowledge Xpert for Oracle A ...

  7. 数组中的每一个对象执行一次方法:makeObjectsPerformSelector

    1,  为数组中的每一个button添加点击事件: [_buttonArray makeObjectsPerformSelector:@selector(addTarget:self action:( ...

  8. APP支付报错ALI40247处理方案!

    简直日狗!这里要吐槽支付宝: 1.支付宝文档太复杂,分类虽然详细,但是我找不到app支付 对应服务端的demo 2.提供下载的sdk都是全整合的 用下来都是一条龙服务,还有一些客户端(app)的请求也 ...

  9. linux下vmware的安装、物理分区使用及卸载

    1.安装 先下载安装文件VMware-Workstation-Full-12 在命令行下执行下载的文件安装即可(需要root权限) wget https://download3.vmware.com/ ...

  10. Uiautomator--Uiselector元素定位

    一.UiSelector作用 按照一定的条件(例如控件的text值,资源id),定位界面上的元素.UiSelector对象的最终目的是去构造一个UiObject对象. 二.元素定位 1.根据text定 ...