@synchronized 지시문이 어떻게 작동하는지 보려면이 멀티 스레딩 응용 프로그램을 수행하고 있습니다. 모든 스레드가 @synchronized의 인수와 동일한 객체를 갖고 있으면 모두 동일하게 기다립니다. 자물쇠. 그래서 나는 모든 스레드에 대해 동일하기 때문에 자기를 인수로 사용한다고 생각했다.
이 응용 프로그램에는 모든 스레드가 여러 번 편집하는 텍스트 필드가 있습니다. 퍼포먼스는 신경 쓰지 않아요. 테스트를위한 것이기 때문에, 전에는 @synchronized 지시어를 쓰지 않고 안에 넣으십시오. 내가 사용하는단순 멀티 스레딩 응용 프로그램이 때때로 실패합니다.
속성 :
@property (weak) IBOutlet NSTextField *textField;
@property (nonatomic, copy) NSNumber* value;
@property (nonatomic,copy) NSMutableArray* threads;
코드 :
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
value= @0;
textField.objectValue= value;
for(int i=0; i<10; i++)
{
NSThread* thread=[[NSThread alloc]initWithTarget: self selector: @selector(routine:) object: nil];
[threads addObject: thread];
[thread start];
}
}
- (void) routine : (id) argument
{
for(NSUInteger i=0; i<100; i++)
{
@synchronized(self)
{
value= @(value.intValue+1);
textField.objectValue= value;
}
}
}
때로는 응용 프로그램이 성공을 가지고 있으며, 나는이 것을 두려워, 때로는 텍스트가 아닌 필드 value.But로 1000 참조 기아와 텍스트 필드에 아무것도 표시되지 않습니다, 그것은 비어 있습니다. 나는 디버그를 시도하지만, 오류의 기준이 나에게 캐주얼 것 때문에 잘못 본 것이 어렵다 때로는 그냥 잘 작동합니다.
SOLUTION
@synthesize threads,value, textField;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
value= @0;
threads=[[NSMutableArray alloc]initWithCapacity: 100];
for(NSUInteger i=0; i<100; i++)
{
NSThread* thread=[[NSThread alloc]initWithTarget: self selector: @selector(routine:) object: nil ];
[threads addObject: thread];
[thread start];
}
}
- (void) routine : (id) arg
{
for(NSUInteger i=0; i<1000; i++)
{
@synchronized(self)
{
value= @(value.intValue+1);
[textField performSelectorOnMainThread: @selector(setObjectValue:) withObject: value waitUntilDone: NO];
}
}
}
이것이 가능합니까? 나는 좋은 질문을 찾았다. 아니면 그냥 꿈꿔? (+1 재미있는 문제입니다.) –
모르겠다 .. 내게 괜찮아 보이는 코드 ..하지만 appkit의 어느 부분이 스레드 안전하다고 확신하지 않습니다 ... –
추가 된 솔루션이 올바르지 않습니다. [알림은 같은 스레드에서 게시 및 수신됩니다.] (http://stackoverflow.com/questions/1004589/nsnotificationcenter-do-objects-receive-notifications-on-the-same-thread-they-a) 중단 점 설정 '-changeValue :'에서 현재 스레드가 주 스레드가 아님을 알 수 있습니다. –