問題を再現できません。@synchronized
ここに、および pthreads に基づいた単純なプログラム (Mac 上では実行され@synchronized
ますが) があります。
void *backgroundThread(void *data)
{
while (true)
{
@synchronized (globalMutex)
{
usleep(USEC_PER_SEC / 3);
}
}
return NULL;
}
int main()
{
pthread_t bgThread = NULL;
globalMutex = [NSObject new];
pthread_create(&bgThread, NULL, &backgroundThread, NULL);
NSTimeInterval lastTime = [[NSDate date] timeIntervalSinceReferenceDate];
while (true)
{
@synchronized (globalMutex)
{
NSTimeInterval elapsed = [[NSDate date] timeIntervalSinceReferenceDate] - lastTime;
NSLog(@"Main Thread 'came up for air' after %lf seconds", elapsed);
lastTime += elapsed;
}
}
}
出力:
TestProj[1494:303] 0.000015 秒後にメイン スレッドが「空中に出てきた」
TestProj[1494:303] 0.003136 秒後にメイン スレッドが「空中に出てきた」
TestProj[1494:303] 0.000637 秒後にメイン スレッドが「空中に出てきた」
TestProj[1494:303] 0.000610 秒後にメイン スレッドが「空中に出てきた」
TestProj[1494:303] 0.000697 秒後にメイン スレッドが「空中に出てきた」
TestProj[1494:303] 0.000576 秒後にメイン スレッドが「空中に現れた」
TestProj[1494:303] 0.000571 秒後にメイン スレッドが「空中に出てきた」
TestProj[1494:303] 0.337343 秒後にメイン スレッドが「空中に出てきた」
TestProj[1494:303] 0.335533 秒後にメイン スレッドが「空中に出てきた」
TestProj[1494:303] 0.335253 秒後にメイン スレッドが「空中に現れた」
TestProj[1494:303] 0.335309 秒後にメイン スレッドが「空中に出てきた」
TestProj[1494:303] 0.335367 秒後にメイン スレッドが「空中に出てきた」
TestProj[1494:303] 0.335223 秒後にメイン スレッドが「空中に出てきた」
TestProj[1494:303] 0.335754 秒後にメイン スレッドが「空中に出てきた」
TestProj[1494:303] 0.335271 秒後にメイン スレッドが「空中に現れた」
TestProj[1494:303] 0.335211 秒後にメイン スレッドが「空中に出てきた」
TestProj[1494:303] 0.334555 秒後にメイン スレッドが「空中に出てきた」
TestProj[1494:303] 0.335245 秒後にメイン スレッドが「空中に現れた」
TestProj[1494:303] 0.335203 秒後にメイン スレッドが「空中に現れた」
TestProj[1494:303] 0.335262 秒後にメイン スレッドが「空中に現れた」
TestProj[1494:303] 0.335252 秒後にメイン スレッドが「空中に出てきた」
TestProj[1494:303] 0.335667 秒後にメイン スレッドが「空中に出てきた」
TestProj[1494:303] 0.335278 秒後にメイン スレッドが「空中に現れた」
TestProj[1494:303] 0.335309 秒後にメイン スレッドが「空中に出てきた」
したがって、ロックを適切に解放していない限り、@synchronized
まさにこのシナリオで必要なものです。あなたの同期コードが実際にどのように見えるかを詳しく説明してください。