NSLock為什麼不能鎖住

tags:    時間:2013-12-03 21:40:40
#import 
 
 @interface MainUI : NSObject
 {
     NSLock* _lock;
 }
 
 -(void)initialize;
 
 @property(nonatomic, retain) NSLock* _enterEmShopLock;
 @property(atomic, assign) volatile BOOL _bEnterEmShop;
 
 @end


#import "MainUI.h"
 
 @implementation MainUI
 
 @synthesize _bEnterEmShop=bEnterEmShop;
 @synthesize _enterEmShopLock=enterEmShopLock;
 
 -(void)initialize
 {
     [NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:nil];
     [NSThread mainThread].name = @"Main";
     NSLog(@"main thread name is %@", [[NSThread mainThread]name]);
     
     bEnterEmShop = YES;
     
     [enterEmShopLock lock];
     NSLog(@"cur thread name is %@ and enter lock", [[NSThread currentThread]name]);
     [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:2]];
     NSLog(@"cur thread name is %@ and exit unlock", [[NSThread currentThread]name]);
     [enterEmShopLock unlock];
 }
 
 -(void)run:(MainUI*)mainUI
 {
     [NSThread currentThread].name = @"Sub";
     if(!mainUI._bEnterEmShop)
     {
         NSLog(@"cur thread name is %@", [[NSThread currentThread]name]);
         [[mainUI _enterEmShopLock]lock];
         NSLog(@"cur thread name is %@ and enter lock", [[NSThread currentThread]name]);
         [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:2]];
         NSLog(@"cur thread name is %@ and exit unlock", [[NSThread currentThread]name]);
         [[mainUI _enterEmShopLock]unlock];
     }
     else {
         NSLog(@"cur thread name is %@ and can't be allowed to do anything", [[NSThread currentThread]name]);
     }
 }
 
 @end


出現的結果:
2013-10-13 16:50:41.368 ThreadSynPrj[18231:f803] main thread name is Main
2013-10-13 16:50:41.368 ThreadSynPrj[18231:1290b] cur thread name is Sub
2013-10-13 16:50:41.370 ThreadSynPrj[18231:f803] cur thread name is Main and enter lock 
2013-10-13 16:50:41.370 ThreadSynPrj[18231:1290b] cur thread name is Sub and enter lock
2013-10-13 16:50:43.372 ThreadSynPrj[18231:f803] cur thread name is Main and exit unlock
2013-10-13 16:50:43.372 ThreadSynPrj[18231:1290b] cur thread name is Sub and exit unlock

為什麼主線程沒有退出,子線程又進來了?NSLock不是互斥鎖嘛?
請高手指導,謝謝!
------解決方案--------------------
    [NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:self];
     [NSThread mainThread].name = @"Main";
     NSLog(@"main thread name is %@", [[NSThread mainThread]name]);
     
     bEnterEmShop = YES;
     enterEmShopLock = [[NSLock alloc]init];
     [enterEmShopLock lock];
     NSLog(@"cur thread name is %@ and enter lock", [[NSThread currentThread]name]);
     [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:2]];
     NSLog(@"cur thread name is %@ and exit unlock", [[NSThread currentThread]name]);
     [enterEmShopLock unlock];

頭文件忘記初始化了,不過這樣也還是不行,還是會出現上述問題,不知道什麼原因!
------解決方案--------------------
原來是我自己寫錯了,在啟動子線程的時候,detachNewThreadSelector 是立即啟動,這個時候我的初始化放在他的後面,這樣當執行子線程的時候,就是未初始化的數據。

推薦閱讀文章

Bookmark the permalink ,來源:互聯網