Cocoa多线程编程札记:NSLock与NSThread

Cocoa多线程编程笔记:NSLock与NSThread


//

#import <Foundation/Foundation.h>

//int main(int argc, const char * argv[])
//{
//
//    @autoreleasepool {
//        
//        // insert code here...
//        NSLog(@"Hello, World!");
//        
//    }
//    return 0;
//}

NSLock *lock;  
@interface MyObject : NSObject  
+(void)aMethod:(id)param;  
@end  
@implementation MyObject  
+(void)aMethod:(id)param{  
    int x;  
    for(x=0;x<50;++x)  
    {  
        [lock lock];  
        NSLog(@"Object Thread says x is %i\n",x);  
        usleep(10);  //语句A
        [lock unlock];  
    }  
    NSLog(@"==Object thread return==");
    return;
   }  
@end  
int main(int argc, char *argv[])  
{   
    int x;  
    lock = [[NSLock alloc] init];  
    [NSThread detachNewThreadSelector:@selector(aMethod:) toTarget:[MyObject class] withObject:nil];  
    
    for(x=0;x<50;++x)  
    {  
        [lock lock];  
        NSLog(@"Main thread says x is %i\n",x);  
        usleep(10);  //语句B
        [lock unlock];  
        usleep(10);  //语句C
    }  
    NSLog(@"==Main thread return==");
    usleep(300); //语句D
    return 0;  
}  



(1)通过NSThread建立线程

(2)通过NSLock进行线程同步,lock与unlock之间代码可以保证在多个线程间保证原子操作。

a:去掉主线程与子线程中的NSLock相关语句后,通过打印发现;2个线程之间打印的顺序随机;

b:通过使用NSLock, 无论语句A与语句B的值设置为多大,两个线程会交替执行(我把语句C设置为10,保证子线程有进入机会);说明NSLcok保证了lock代码段的原子操作。

c: 主线程退出后,子线程也会退出。 通过修改语句D的值较大时,子线程有足够时间退出,可以打印“Object thread return”,较小时不一定会打印出来。