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

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

进程的结构: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. iOS面试题

    一个区分度很大的面试题 考察一个面试者基础咋样,基本上问一个 @property 就够了: @property 后面可以有哪些修饰符? 线程安全的: atomic,nonatomic 访问权限的 re ...

  2. [C/C++] C/C++延伸学习系列之STL及Boost库概述

    想要彻底搞懂C++是很难的,或许是不太现实的.但是不积硅步,无以至千里,所以抽时间来坚持学习一点,总结一点,多多锻炼几次,相信总有一天我们会变得"了解"C++. 1. C++标准库 ...

  3. 网络第一节——NSURLConnection

    一.NSURLConnection的常用类 (1)NSURL:请求地址 (2)NSURLRequest:封装一个请求,保存发给服务器的全部数据,包括一个NSURL对象,请求方法.请求头.请求体.... ...

  4. 双向数据绑定(angular,vue)

    最近github上插件项目更新了关于双向数据绑定的实现方式,关于angular和vue. angular众所周知是使用的脏检查($dirty).一开始大家会认为angular开启了类似setInter ...

  5. cookie (储存在用户本地终端上的数据)

    Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份.进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密).定义于 RFC2109 和 2965 中的都已废弃 ...

  6. MySQL 应用优化

    一.使用连接池 二.减少对MySQL的访问 (A) 避免对同一数据做重复检索. (B) 使用查询缓存,MySQL的查询缓存会存储SELECT查询的命令文本和相应的结果. (C) 增加CACHE层 三. ...

  7. iOS中为什么block用copy属性

    1. Block的声明和线程安全Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非ARC ...

  8. Sublime text 3如何编辑less并转(编译)成css文件

    今天开始学习使用less这个强大方便的前端工具,本来是考虑用koala(专门编辑less的软件)来使用less的,但是发现sublime编辑器也可以实现对less的编译及高亮显示代码,这样既能少用一个 ...

  9. sublime自动生成头部注释

    1.在tool->new snippet-创建一个新的snippet sublime text2 用snippet 创建文件头部信息 Snippets are smart templates t ...

  10. JavaFx客户端服务器C/S架构搭建

    客户端获取服务器端软件更新版本方法: package com.platform.ui.update; import java.io.BufferedInputStream; import java.i ...