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?