OC多线程分享pthread&NSThread
2016-07-26 本文已影响0人
ZealPenK
一.多线程基础{
1. 耗时操作:I/O操作:讲数据从内存输入或者输出到外部设备
2. 多线程优,缺点:
优点:{1.能'适当'提高程序的执行效率
2.能'适当'提高CPU和内存的利用率
3.线程上的任务完成后,线程会自动销毁,节省内存}
缺点:{1.开启线程需要占用一定的内存空间,如果开启过多线程,就会大量占用CPU资源,降低程序性能
2.内存占用:子线程512KB,主线程ISO8前1M,后512KB
3.线程开启越多,CPU调度相差的开销就越大{时间开销/空间开销}
4.程序设计更加复杂:比如线程间的通信,线程间的数据共享;}
二.pthread{
1.基于C语言的;
2.跨平台可移植;
3.线程生命周期程序员控制;
4.引入头文件:#import <pthread.h>
5.创建方法:pthread_create{
a.参数1:直线线程标识符的指针:'定义'pthread_t pthread = '使用'&pthread
b.参数2:线程属性;
c.参数3:指向新线程的指针(一个方法,或者说需要新线程去执行的地方);
d.参数4:线程参数;
e.返回值:BOOL,0表示创建线程成功,反之失败(成功只有一种,失败情况很多种)}
6.桥接:__bridge将OC语言的属性转化为C语言的属性,告诉编译器,这是个C语言属性,不需要内存管理,你啥都不做就行了;}
三.NSThread{
1.基于OC语言,面向对象;
2.可直接操作线程对象;
3.程序呀管理线程生命周期;
4.三种创建方法{
a.对象创建方法:"可以获得对象,对对象进行操作,需手动启动"
NSThread *thread = [[NSThread alloc] initWithTarget:self @selector(demo:) object:@"参数"];
'需手动启动':[thread start];
b.类的创建方法:"无法获取线程对象,自动开启线程"'detach分离'
[NSThread detachNewThreadSelector:@selector(demo:) toTarget:self withObject:@"参数"];
c.NSObject的分类创建:"无法获取对象,任何NSObject对象都可以创建,自动开启线程"
[self perfromSelectorInBackground:@selector(demo:) withObject:@"参数"];}
5.线程的生命周期:{
a.新建:创建线程对象:[[NSThread alloc] initWithTarget];
b.就绪:将线程放入'可调动释放池',等待CPU调用:[NSThread start];
c.运行:CPU调度'可调动释放池'中'就绪状态'的线程,线程结束之前,状态会在就绪和运行间来回切换(CPU调度特点,CPU完成,程序员无法干涉);
d.阻塞:{
1.休眠指定时间:[NSThread sleepForTimeInterval:1.0];
2.休眠到指定日期:[NSThread sleepUntilDate:[NSDate dateWith]];
3.互斥锁:@synchronized'只能有一个线程访问这个属性,其他线程会阻塞等待访问结束'}
e.死亡:正常死亡:线程执行结束 非正常死亡:程序崩溃/满足某个条件后,线程内部强制退出,调用"exit"("主线程中严禁调用exit")
f.重要注意:{
1."主线程中严禁调用exit"
2."[NSThread exit]方法会停止当前线程"
3."在调用[NSThread exit]方法前,一定要释放之前C语言框架创建的对象"
"CGMutablePathRef path = CGPathCreateMutable()"
"CGPathRelease(path);"}}
6.线程属性:{
1.name:线程名称,用来定义BUG位置
2.threadPriority:线程优先级,浮点数0~1,1最高,默认0.5,只CPU决定调用频率,最好不要修改;
3stackSize:栈区大小:默认512KB,最新哦啊16KB,必须是4KB的整数打印时候/1024;}
7.线程安全:{
1.互斥锁/同步锁:{'单写&单读'
a.可以保证被锁定的代码,同一时间,只能有一个线程可以操作;
b.任何NSObject的对象,都是可以所对象,你饿不都有一把锁,big切默认是开着的;
c.锁对象:一定要全局锁对象,保证所有的线程都能访问(self是最方便的所对象)
d.互斥锁的范文应该尽量小,但一定要锁住资源的'读写'部分
e.加锁后程序效率比不加锁要"低",因为线程要等待解锁,牺牲了性能保证安全性;}