In questo periodo sto lavorando su un progetto (.NET) che fa un uso intenso di ottimizzatori lineari (soluzione di sistema di equazioni) unmanaged. La caratteristica degli ottimizzatori consiste nell'avere una serie di funzioni che valorizzano le variabili, costanti e vincoli, quindi una funzione di esecuzione (es. optimize).
Dato che le dichiarazioni delle funzioni da codice .NET sono statiche (non è possibile altrimenti) il problema sorge se si usa l'ottimizzatore in ambiente multi-threaded. Si finisce per incrociare le variabili dei problemi (mappati sui singoli thread) di ottimizzazione dando un risultato certamente errato.
Ho quindi avviato un confronto con Corrado Cavalli e Raffaele Rialdi. Dopo una prima discussione abbiamo convenuto che vi sono due soluzioni:
1. Usare un Mutex (o Monitor)
2. Eludere il sistema duplicando la libreria unmanaged caricandole in memoria con nomi diversi (uno per ogni thread).
Nel mio caso adotto la seconda soluzione in quanto l'ottimizzatore è richiatamo molte volte (10000) e quindi il mutex sarebbe troppo penalizzante.