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”,较小时不一定会打印出来。