Chinaunix首页 | 论坛 | 博客
  • 博客访问: 815047
  • 博文数量: 321
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 936
  • 用 户 组: 普通用户
  • 注册时间: 2013-02-23 11:25
文章分类

全部博文(321)

文章存档

2017年(1)

2016年(10)

2015年(61)

2014年(187)

2013年(62)

分类: 嵌入式

2013-03-24 22:11:29

1、多线程:经典例子:生成和消费者模式。

2、线程是进程的多条执行路径(相当于在进程内部)。

3、进程切换比较慢,线程因为共享同一块内存,所以切换比较快。(又快又省内存空间)

4、线程劣势:可能数据丢失:解决办法:1,原子操作;2,上锁。因为数据读取分三个步骤,从内存读取,在寄存器计算,再存到内存。

5、小结:进程和线程的比较:区别和联系:

a) 进程:是一个自由分配的单位,各进程之间一般不能共享资源(进程间通讯不考虑)

b) 多线程:是同一进程内部的多条并发执行路径。多线程可以共享同一进程内部的资源,但是资源共享容易造成,数据冲突,所以要注意保护共享资源(线程同步)

6、gcc mythread.c -o mythread -lpthread==>引用这个库。

7、函数调用是串行的,多线程是并行的。

8、概念:进程:是系统中程序执行和资源分配的基本单位。线程:是一个进程内的基本调度单位,也可以称为轻量级进程。

9、线程分类:用户级线程和核心级线程

10、用户级线程:主要解决的是上下文切换的问题;主要缺点是在一个进程中的多个线 程的调度中无法发挥多处理器的优势。如果一个进程中的某一个线程调用了一个阻塞的 系统调用,那么该进程包括该进程中的其他所有线程也同时被阻塞。

11、核心级线程:允许不同进程中的线程按照同一相对优先调度方法进行调度

12、基本操作:

a) 看看线程和进程运行的区别:线程共享资源,i2个随机执行的线程一起加;进程不共享资源,2个进程的i独立.

b) 创建线程:pthread_create( &id1,NULL, ( void *  )thread1,&tmp )// 如果强化转成(void *)会更标准

c) 两种退出方式:一种是函数运行完之后,该线程退出,另一种是用pthread_exit(NULL);因为在使用 exit 之后,该进程中的所有线程都终止了。因此,在线程中就可以使用 pthread_exit 来代替进程中的 exit

d) pthread_join 可以用于将当前线程挂起,等待线程的结束。pthread_join( id1,NULL );  //主线程等待子线程结束,如果不等,则子线程还没来得及执行就整个进程结束了。

13、线程对资源访问的唯一性问题:主要POSIX 中线程同步的方法:互斥锁、 信号量。

14、互斥锁:mutex===>上锁和解锁两种状态。可以把它看做全局变量。即一个上锁 状态的线程对共享资源的操作,其他线程不能访问,也不能上锁,直到该锁释放。

15、end_time = time(NULL)+20;//time(NULL)获取当前的时间

16、步骤:

a) ret = pthread_mutex_init(&mutex,NULL);互斥锁初始化。

b) ret = pthread_create(&id1, NULL,(void *)pthread1, NULL );//创建线程

c)  //主线程等待子线程结束

d)  pthread_join(id1,NULL);

e) (pthread_mutex_lock(&mutex) == -1)//上锁 ===阻塞

ret = pthread_mutex_trylock(&mutex)//尝试上锁===非阻塞

f) pthread_mutex_unlock(&mutex) == -1)//解锁

g)pthread_mutex_destroy(&mutex);//销毁互斥锁

所有访问公共资源都要先上锁,访问完以后解锁,锁是一个全局变量。

17、信息量

a) PV原语:一次 操作使 sem 减一(分配资源),而一次 操作使sem 加一(释放资源)。

b) Sem:线程最多能有几条可以访问这个资源。当sem>=1时,该进程(或线程)具有公共资源的访问权限。当sem<=0时,无访问权限。Sem=1,互斥锁

c) sem_init(&sem,0,1)//信号量的初始化

d) pthread_create(&id1,NULL,(void *)pthread1,NULL)//子线程的创建

e) pthread_join(id1,NULL);//等待子线程运行结束

f) sem_wait(&sem);//等待信号量可以申请访问sem-1

g) sem_post(&sem);//释放信号量sem+1

h) 下面是介绍:sem_getvalue 用于得到信号量的值。

i) sem_destroy 用于删除信号量。

阅读(837) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~