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