Qualcosa come questo (C #) FA il trucco ...
public class MyNonThreadSafeClass()
{
public MyNonThreadSafeClass()
{
currentThreadId = Thread.CurrentThread.ManagedThreadId;
}
private readonly int currentThreadId;
public void SomeNonThreadSafeMethod()
{
AssertSameThread();
//do your thing
}
private void AssertSameThread()
{
if(currentThreadId != Thread.CurrentThread.ManagedThreadId)
throw new InvalidOperationException("Method must be called on the same thread that created the containing object");
}
}
Ciò assicurerebbe che solo il thread che ha creato l'istanza dell'oggetto possa funzionare con esso. Variazioni di questo potrebbero garantire che nessun metodo venga chiamato contemporaneamente da thread diversi allo stesso tempo (ma consentire a un thread di creare l'istanza e quindi assegnarlo a un altro thread con cui lavorare) o che il thread di creazione debba avere un messaggio pump (ed è quindi un thread dell'interfaccia utente e quindi molto probabilmente il thread "principale" dell'app).
Tuttavia, nel complesso, se si prevede che la libreria possa essere utilizzata dai thread paralleli di un processo e si desidera supportarla, la renderei thread-safe. Non è poi così difficile; utilizzare monitor, mutex o altri blocchi per proteggere lo stato condiviso e favorire "funzioni pure" che non si basano sullo stato dell'ambito dell'istanza.