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

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

进程的结构: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 定义的信号量:

**   无名信号量

有名信号量

最新文章

  1. 理解 .NET Platform Standard
  2. 基于讯飞语音API应用开发之——离线词典构建
  3. Python基础篇【第8篇】: Socket编程(二)SocketServer
  4. Nginx日志切割,以及脚本上传nginx的切割日志
  5. 黄聪:说说JSON和JSONP,也许你会豁然开朗(转)
  6. Linux网络统计工具/命令
  7. HDUOJ-------1052Tian Ji -- The Horse Racing(田忌赛马)
  8. 我的Linux书架
  9. 【恒天云技术分享系列11】Sheepdog简介
  10. 【转】angular学习笔记(十四)-$watch(1)
  11. flexbox布局模式-- 浅谈
  12. DateTimeBox( 日期时间输入框)
  13. IWebBrowser隐藏滚动条
  14. Ext.Ajax.request
  15. svn 提交 working copy is not up-to-date
  16. appium定位
  17. [十一]基础数据类型之Character
  18. Java 高级框架——Mybatis(一)
  19. php把网络图片转Base64编码。
  20. poj 3258 3273

热门文章

  1. 【12-26】go.js
  2. Tomcat 知识点
  3. 360浏览器 默认IE7渲染的解决
  4. MySQL索引类型总结和使用技巧以及注意事项
  5. js事件技巧方法整合
  6. intellij idea Maven 创建项目时出现的一些问题
  7. RBAC中 permission , role, rule 的理解
  8. PhotoSwipe插件的使用
  9. C#夯实基础之接口(《CLR via C#》读书笔记)
  10. PHP Windows环境部署