Mi piace il comando di separazione delle query modello (da OOSC / Eiffel - in pratica si restituisce un valore o si cambia lo stato della classe, ma non entrambi). Questo rende più facile ragionare sulla classe ed è più facile scrivere classi eccezionalmente sicure.
Ora, con il multi-threading, mi imbatto in un grosso problema: la separazione della query e il comando sostanzialmente invalida il risultato dalla query poiché qualsiasi cosa può accadere tra questi 2.
Quindi la mia domanda è: come gestisci la separazione della query dei comandi in un ambiente multi-thread?
Esempio di chiarimento:
Uno stack con la separazione delle query dei comandi avrebbe i seguenti metodi:
- push (comando)
- pop (comando - ma non restituisce un valore)
- top (query - restituisce il valore)
- vuoto (query)
Il problema qui è che posso essere svuotato come stato, ma in questo caso non posso contare sul recupero di un elemento, poiché tra la chiamata di vuoto e la chiamata di cima, lo stack potrebbe essere stato svuotato. Lo stesso vale per il pop & superiore. Se ottengo un oggetto che utilizza la parte superiore, non posso essere sicuro che l'elemento che popo sia lo stesso.
Questo può essere risolto usando i lock esterni - ma non è esattamente quello che chiamo design thread-safe.