2010-12-16 9 views
5

Çoktan programlama için oldukça yeni ve tamam olup olmadığını merak ediyorum veyaMultithreading programlamada atomik bir BOOL bayrağının yapılması mantıklı olur mu?

@property BOOL shouldDoIt; //atomic 

gibi bir özellik oluşturmak için

- (void) loop{ 
    // ... do stuff ... 
    if (self.shouldDoIt) { 
     [self doIt]; 
     self.shouldDoIt = NO; 
    } 
    // ... do more stuff ... 
} 

- (void) methodCalledFromMainThread{ 
    self.shouldDoIt = YES; 
} 
- (void) methodCalledFromMainThread{ 
    self.shouldDoIt = YES; 
} 

var mı? Atomun atomik olmayana göre yavaş olduğunu biliyorum ve programımın daha fazla hıza ihtiyacı var ama atomik kullanmıyorsanız if (shouldDoIt){ yapıyor mu?

cevap

2

cevap sorunun cevabı tamamen bağlıdır: "Her zaman için sadece bir kere doIt çalıştırmak gerekiyor ana iş parçacığı shouldDoIt bayrağını ayarlar"

Bu sorunun cevabı ise, bayrak sıfırlamak önce

"evet" sonra kod doIt başladık sonra ana iş parçacığı YES için shouldDoIt ayarlayabilirsiniz için işe ama olmaz.

Yanıt "hayır" ise, bu dar durumda, çok CPU yapılandırmasında, bayrağı diğer iş parçacığının hemen olmaması için önbelleğe alınmak zorunda kalması dışında, elinizde ne varsa Tamam değişimi gör. Bu nedenle muhtemelen en az OSAtomicTestAndClearBarrier() ve OSAtomicTestAndSetBarrier() 'i kullanmak istediğiniz kadar hızlı bir şekilde kullanabilirsiniz. Bununla birlikte, bunu yapmanız gerektiğine kuşku duyuyorum. Sanırım, tasarımın yeniden düzenlenmesi, bir şekilde doIt, do stuff ve do more stuff'da yapmaya çalıştığınız şeye bağlı olarak daha iyi sonuçlar alacağınızı düşünebilirsiniz.

+0

Sadece ** yazar ** iş parçacığı ve ** okuyucu ** iş parçacığı kullanıyorsak, değişken ** 'ye kilitlenmemiş erişime ihtiyacımız var. ElbDoI ** elbette ana iş parçacığı beklemeli ** beklemede ** 0 olmalı tekrar ayarlanmadan önce ** shouldDoI **. –

+0

JeremyP, bana geri ve daha önce herhangi bir geri ayarlanmama arasındaki farkı fark etmemi sağladınız. OSAtomicTestAndClear/SetBarrier() için +1;) – nacho4d

0

Apple'dan Threading Programming Guide'u önce okuyun ve bir NSLock 'a ihtiyacınız olduğunu düşünün, ancak bir çıkmaz elde edebileceğiniz konusunda dikkatli olun. Good Luck

+0

NSLock'un bir alternatif olduğunu anlıyorum ama bence çok fazla iş var ve bu vaka gibi tek bir BOOL bayrağının olması durumunda 'atomik' yeterli ise finale girmeye çalışıyorum. – nacho4d

+0

Bir özellik atomu ayarlarsanız, ayarlayıcı ve alıcıda mutex kilitleri olacaktır. Eğer sizde bool'u evet'e ve arkadaki bir iş parçacığına ayarlayıp, bazı şeyler yaparsanız, ve bunu yaptıktan sonra, hiçbir şey görmüyorsanız, burada herhangi bir sorun görmüyorum. Kod için –

2

Açık size kod bu bölümünde arka dişli

[NSThread detachNewThreadSelector:@selector(backThreadAction:) toTarget:self withObject:nil]; 


-(void) backThreadAction:(id*)someObject{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    //do stuff here 

    [self performSelectorOnMainThread:@selector(didFinishBackThreadAction:) withObject:nil waitUntilDone:NO]; 
    [pool release]; 
} 

-(void) didFinishBackThreadAction:(id *)someObject{ 
    //set your bool to no 
} 
+0

+1;) GCD ile aynı şeyi yapabilirim (NSThread veya performSelectorOn kullanmıyorum ...API'ler) – nacho4d

0

bazı iş yapmak sonra hiç için ayarlamak istediğiniz bir BOOL sahip iplik olabilir:

if (self.shouldDoIt) { 
    [self doIt]; 

atomik olmadığında, doIt çağırdığınızda hala true olduğunu garanti etmez. Testten sonra değerin değişmediğinden ve yapmanız gerekenleri yapmadan önce, bir kilit kullanmanız gerekir.

+0

Doğru değil, sadece bir yazıcı ipliği ve okuyucu ipliği kullanıyoruz! –