linux线程
线程:轻量级进程,在资源、数据方面不需要进行复制
不间断地跟踪指令执行的路径被称为执行路线
进程的结构: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线程的更多相关文章
- [转载]Linux 线程实现机制分析
本文转自http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/ 支持原创.尊重原创,分享知识! 自从多线程编程的概念出现在 Linux ...
- linux线程的实现
首先从OS设计原理上阐明三种线程:内核线程.轻量级进程.用户线程 内核线程 内核线程就是内核的分身,一个分身可以处理一件特定事情.这在处理异步事件如异步IO时特别有用.内核线程的使用是廉价的,唯一使用 ...
- linux线程的实现【转】
转自:http://www.cnblogs.com/zhaoyl/p/3620204.html 首先从OS设计原理上阐明三种线程:内核线程.轻量级进程.用户线程 内核线程 内核线程就是内核的分身,一个 ...
- Linux线程-创建
Linux的线程实现是在内核以外来实现的,内核本身并不提供线程创建.但是内核为提供线程[也就是轻量级进程]提供了两个系统调用__clone()和fork (),这两个系统调用都为准备一些参数,最终都用 ...
- Linux线程学习(一)
一.Linux进程与线程概述 进程与线程 为什么对于大多数合作性任务,多线程比多个独立的进程更优越呢?这是因为,线程共享相同的内存空间.不同的线程可以存取内存中的同一个变量.所以,程序中的所有线程都可 ...
- Linux线程学习(二)
线程基础 进程 系统中程序执行和资源分配的基本单位 每个进程有自己的数据段.代码段和堆栈段 在进行切换时需要有比较复杂的上下文切换 线程 减少处理机的空转时间,支持多处理器以及减少上下文切换开销, ...
- Linux 线程(进程)数限制分析
1.问题来源公司线上环境出现MQ不能接受消息的异常,运维和开发人员临时切换另一台服务器的MQ后恢复.同时运维人员反馈在出现问题的服务器上很多基本的命令都不能运行,出现如下错误:2. 初步原因分析和 ...
- Linux 线程与进程,以及通信
http://blog.chinaunix.net/uid-25324849-id-3110075.html 部分转自:http://blog.chinaunix.net/uid-20620288-i ...
- linux 线程的内核栈是独立的还是共享父进程的?
需要考证 考证结果: 其内核栈是独立的 206 static struct task_struct *dup_task_struct(struct task_struct *orig) 207 { 2 ...
- Linux 线程模型的比较:LinuxThreads 和 NPTL
Linux 线程模型的比较:LinuxThreads 和 NPTL GNU_LIBPTHREAD_VERSION 宏 大部分现代 Linux 发行版都预装了 LinuxThreads 和 NPTL,因 ...
随机推荐
- Windows 下安装 MongoDB
Windows 下安装 MongoDB 的步骤:1.官网www.mongodb.com下载安装包或zip包2.解压下载的文件到文件夹 D:\mongo .3.使用管理员权限打开CMD,导航到目录 D: ...
- 分析oracle的执行计划(explain plan)并对对sql进行优化实践
基于oracle的应用系统很多性能问题,是由应用系统sql性能低劣引起的,所以,sql的性能优化很重要,分析与优化sql的性能我们一般通过查看该sql的执行计划,本文就如何看懂执行计划,以及如何通过分 ...
- 第4天--linux内核学习
驱动使用方式1.编译到内核中 * make uImage进入到系统后mknod /dev/led c 500 0 创建设备节点 2.编译为模块 M make module进入到系统后 mknod /d ...
- Java 解决约瑟夫问题
约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题.在计算机编程的算法中,类似问题又称为约瑟夫环.又称“丢手绢问题”.) 有这样一个故事,15个教徒和15个非教徒在深海遇险必须讲 ...
- iOS-关于使用其他应用打开本应用文档
简介:本片文章是对官方文档的翻译,非常的感谢文章的翻译者:颐和园 官方地址:Document Interaction Programming Topics for iOS 文章的介绍内容: ***** ...
- 第3月第27天 uitableviewcell复用
1. 有需求cell一行放两个子view,也可以放3个.子view控件都是一样,只有大小区分.需要复用吗? 复用实现:创建时创建3个,拿到数据时是两个就设置两个的frame,是3个就设置3个的fram ...
- spring中InitializingBean接口使用理解
InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候会执行该方法. 测试程序如下: imp ...
- zabbix触发器依赖
触发器依赖 Zabbix - Router1 - Router2 – Host 如果router1宕机了,那么router2和host都不能连上,这样的话就会发router1.router2和host ...
- Intent
1.http://blog.csdn.net/daogepiqian/article/details/50606474 2.http://blog.csdn.net/wulianghuan/artic ...
- 通过style控制圆形imageView显示
1. 2.drawable--style <?xml version="1.0" encoding="utf-8"?> <layer-list ...