2011-05-06 10 views
6

Jabłko Threading przewodnik mówi:Czy istnieje sposób wprowadzania wielowątkowego kakao bez tworzenia fałszywego NSThread?

przypadku aplikacji wielowątkowych, ramy Kakao używać zamki i inne formy synchronizacji wewnętrznej w celu zapewnienia, że ​​zachowują się poprawnie. Aby jednak zapobiec sytuacji, w której te blokady nie obniżają wydajności w przypadku jednowątkowego, Cocoa nie tworzy ich, dopóki aplikacja nie uruchomi swojego pierwszego nowego wątku przy użyciu klasy NSThread. Jeśli spawnujesz wątki używając tylko wątków POSIX, Cocoa nie otrzyma powiadomień, których potrzebuje, aby wiedzieć, że twoja aplikacja jest teraz wielowątkowa. W takim przypadku operacje obejmujące framugi Cocoa mogą zdestabilizować lub zawiesić aplikację.

Aby Cocoa wiedział, że zamierzasz używać wielu wątków, wystarczy odradzić jeden wątek za pomocą klasy NSThread i pozwolić, aby ten wątek natychmiast się zakończył. Twój punkt wejścia wątku nie musi nic robić. Wystarczy akt tarowania wątku za pomocą NSThread, aby zapewnić, że blokady wymagane przez ramy Cocoa są wprowadzone.

W mojej aplikacji na iOS uruchamiam kilka pthreadów z kodu C++ od samego początku. Aby upewnić się, że aplikacja zachowuje się prawidłowo, zgodnie z powyższym dokumentem tworzę fałszywe NSThread, które nie robi nic. Nie lubię tworzyć takiego bezużytecznego kodu (zwykle jest to WTF, kiedy po raz pierwszy go czytasz) i chcę tego uniknąć. Czy istnieje lepszy sposób na umieszczenie mojej aplikacji w trybie wielowątkowym?

+0

Pomoże to zobaczyć kod w miejscu tworzysz NSThread. Czy dzwonisz "start" w wątku? – pzearfoss

Odpowiedz

3

Jeśli tak, to nie jest publiczna i może być niestabilna.

Jeśli uderzasz w WTF w swoim kodzie, zmieniaj nazwy i rejiguj rzeczy tak, aby miały sens. Ponieważ trzeba fikcyjny obiekt z manekina selektora jak dobrze, można po prostu dodać wyrzucenie klasę jak CocoaMultithreading a następnie wysłać go do +beginMultithreading wiadomość:

@interface CocoaMultithreading : NSObject 
+ (void)beginMultithreading; 
@end 

int 
main(void) { 
    [CocoaMultithreading beginMultithreading]; 
    /* now do whatever you want */ 
    return EXIT_SUCCESS; 
} 

@implementation CocoaMultithreading 
+ (void)dummyThread:(id)unused 
{ 
    (void)unused; 
} 

+ (void)beginMultithreading 
{ 
    [NSThread detachNewThreadSelector:@selector(dummyThread:) 
      toTarget:self withObject:nil]; 
} 
@end 

które powinny być na tyle wyraźne.

ETA: Alexander Staubo zwraca uwagę, że od OS X 10.5/iOS 2.0, można wywołać metodę -start na zasadzie NSThread bezpośrednio, więc bardzo najprostszy sposób, aby przerzucić się na Cocoa wielowątkowości byłoby to:

void XXXActivateCocoaMultithreading(void) { [[NSThread new] start]; } 

Następnie w main funkcję:

XXXActivateCocoaMultithreading(); 

to jest jawne, jak również, ale daleko le ss niechlujny. (Numer XXX przypomina o przedrostkach funkcji niestatycznych, ponieważ funkcje statyczne często stają się niestatyczne w pewnym momencie, przedrostek ich wszystkich od samego początku jest dobrym posunięciem.)

+0

W rzeczywistości wygląda na to, że jest to wystarczające: '[[NSThread new] start];'. Po tym, '[NSThread isMultiThreaded]' zwraca 'TAK'. –

+0

@AlexanderStaubo Nice! '-start' został dodany do' NSThread' w OS X 10.5 i jest w iOS od 2.0, więc nie martw się. Moim jedynym zmartwieniem byłoby prawdopodobnie wykorzystanie nieokreślonego zachowania, jeśli chodzi o to, co 'main' ma na magazynie' NSThread'. Widzę wzmianki w dokumentach 'NSThread' o" domyślnym 'głównym' ', ale nie ma dyskusji o tym, co zrobi, jeśli nie przejechałeś go w podklasie lub nie ustawiłeś celu i selektora. Jeśli ktoś jest w porządku z tym, to jest w 100% najprostszy sposób, chociaż powinni dodać coś, co wyjaśniłoby, dlaczego losowo wystrzelili z manekina. –

+0

Wygląda na to, że NSThread po prostu ignoruje selektory, które nie istnieją. We wcześniejszym ObjC wydało to ostrzeżenie dla stderr, w ObjC 2.0 wygląda na to, że jest cicho. (Naprawdę chciałbym, aby Xcode pochodziło z rdzennymi źródłami frameworka. Próba demontażu biblioteki Foundation nie doprowadziła mnie nigdzie szybko.) –

Powiązane problemy