全部博文(321)
分类: 嵌入式
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) 看看线程和进程运行的区别:线程共享资源,i由2个随机执行的线程一起加;进程不共享资源,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原语:一次 P 操作使 sem 减一(分配资源),而一次 V 操作使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 用于删除信号量。