Ho avuto una conversazione con alcuni colleghi e il concetto di sicurezza del thread per una struttura dati è venuto fuori.
In questo esempio, abbiamo 2 thread: un thread principale e un thread in background.
Per la seguente pseudo classe:
class Foo {
Array myArray;
// Only ever called on the main thread
// This method will call into the background thread
// but when complete the onCompleteBlock will be called
// on the main thread.
function method1() {
// do something to the array on main thread
myArray.add('foo');
callBackgroundThread(onComplete() {
// onComplete callback is called on main thread
// do something else to the array on the main thread
myArray.add('bar');
})
}
// only ever called on the main thread
function method2() {
// do some other stuff to the array on the main thread
if (myArray.contains('bar') {
myArray.remove('foo');
}
}
}
Quindi in questo esempio la classe ha una matrice come una struttura di dati. Entrambi i metodi sono sempre garantiti per essere richiamati sul thread principale. Method1 chiama una funzione che avvia un processo in background, quando il processo termina richiama nel thread principale.
Questa classe e la struttura dei dati di myArray sono "sicuri"?
So che questa classe non è thread-safe in quanto la struttura dei dati myArray non è protetta da alcuna sincronizzazione. Quindi se più thread chiamavano method1 e method avremmo avuto problemi. Ma ogni volta che viene utilizzato myArray, viene utilizzato sul thread principale.
-
Un argomento sul perché questo potrebbe non essere sicuro è che se il thread principale è in pausa (come quando siamo nel thread in background), non può essere ripreso nello stesso punto in cui era stato interrotto, cioè forse un operazione chiamata method2 () ed è qui che il thread principale si riattiva e riprende.
-
Un altro è che la memoria potrebbe essere stata scambiata. Non sono sicuro di cosa si intendesse per questo.
Per essere onesti, non ho compreso appieno entrambe le argomentazioni e ho pensato che questa classe andava bene poiché tutte le variabili erano accessibili solo sul thread principale. Se uno dei due argomenti sopra è vero, qualcuno può aiutare a spiegare ulteriormente? Ho pensato che assicurarmi di modificare i dati sullo stesso thread sarebbe sicuro.