Илья Ермаков писал(а):
На возражения "а многопоточность...", напоминаю, что мы у себя в "Метасистемах" приняли решение, что внутри одного объектного пространства, т.е. одного экземпляра ядра ББ, нескольких потоков у нас не будет никогда. Ввиду чего сразу перестали забивать себе мозги по каждому поводу "а что, если вот эта служба будет использоваться несколькими потоками...".
И получили возможность использовать ряд простых схем.
Можно это вынести в отдельную ветку и как следует обсудить.
Нахожу ваше решение излише строгим. Его можно смягчить.
Я вот в дотнете тоже к хозяйствованию в одном (логическом) объектном пространстве допускаю только один поток, но это не означает, что в одном экземпляре рантайма у меня существует всего одно (логическое) объектное пространство. У меня их несколько непересекающихся. Они взаимодействуют друг с другом с помощью очередей сообщений.
На тот случай, чтобы кто-то случайно не вызвал какую-то процедуру не в том потоке в каком надо у меня там стоят рантайм-проверки. Например, если какие-то процедуры должны исполняться только потоком класса BasicService, то в начале каждой из них стоит вызов очень маленькой процедурки (тактов на десять) BasicService.ThreadSafeInsurance()
Код:
/// <summary>
/// Осуществляет проверку того, что текущий поток является главным потоком сервиса.
/// Если текущий поток оказался другой, то возбуждается System.Exception.
/// </summary>
public static void ThreadSafeInsurance ()
{
int id = System.Threading.Thread.CurrentThread.ManagedThreadId;
if (id != service_managed_thread_id)
{
throw new System.Exception("You must call this code only in main service thread context. Service thread id = "
+ service_managed_thread_id + ", current thread id = " + id + ".");
}
}
В будущем планирую изобрести способ разбить большое "объектное пространство" на "дерево объектных пространств". В корне "дерева" будет работать один поток раскидывая сообщения по ветвям. Непересекающиеся "ветви объектного дерева" будут обслуживать несколько других потоков. Ветвей может быть очень много, потоков - сколько процессорных ядер + эпсилон.