Come spedire queste funzioni in Objective C per non bloccare il thread principale?

2

C'è un grande oggetto condiviso (tipo di contesto OpenGL) nel mio progetto. Vi si accede da più thread. Per garantire che solo un thread al momento utilizzi SHARED_OBJECT , viene utilizzato il mutex (tipo di NSRecursiveLock ).

Il problema è che talvolta MAIN_THREAD è in attesa molto mentre qualche BG_THREAD sta facendo qualcosa con SHARED_OBJECT .

Non dovrei cambiare architettura (per riscrivere questo schema mutex).
Il problema attuale sta nel seguire: C'è my_backround_func (richiede molto tempo), che viene chiamato prima di main_thread_func1 (richiede pochi millisecondi) e main_thread_func2 .

Queste funzioni sono distribuite su tutto il progetto. Per risolvere il problema, ho creato la classe singleton Dispatcher , che consente di registrare main_thread_func* e consente a my_backround_func di chiedere se tutto main_thread_funcs è già stato eseguito.

Utilizza meccanismi Objective C come NSStringFromSelector e " _cmd ".

All'inizio del programma registro le funzioni:

[[MyBackgroundFunctionDispatcher dispatcher] setCanCallBgFunc:NO forSelector:NSStringFromSelector(@selector(main_thread_func1:))];

[[MyBackgroundFunctionDispatcher dispatcher] setCanCallBgFunc:NO forSelector:NSStringFromSelector(@selector(main_thread_func2:))];

E alla fine di main_thread_func1 e main_thread_func2 chiamo

[[MyBackgroundFunctionDispatcher dispatcher] setCanCallBgFunc:YES forSelector:NSStringFromSelector(_cmd)]; 

Tutto questo thread in background è in attesa:

while ( ![[MyBackgroundFunctionDispatcher dispatcher] setCanCallBgFunc] )
    sleep_ms(10);

Quindi, mi sono assicurato che la funzione di sfondo fosse chiamata DOPO le funzioni di thread principale registrate. MyBackgroundFunctionDispatcher può essere esteso per contenere le funzioni registrate non solo per my_backround_func , ma per my_backround_func1 , my_backround_func2 .

Mentre la soluzione sembra brutta e ho il sospetto che mi manchi un certo schema.

Potresti dare qualche consiglio per favore?

    
posta Olha Pavliuk 13.01.2018 - 10:13
fonte

0 risposte

Leggi altre domande sui tag