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?