Я изучал эрланг, и в результате читал (хорошо, бегло бегло) о модели акторов.
Насколько я понимаю, модель акторов - это просто набор функций (выполняемых в облегченных потоках, называемых «процессами» в erlang), которые взаимодействуют друг с другом только посредством передачи сообщений.
Это кажется довольно тривиальным для реализации в C ++ или любой другой язык:
class BaseActor {
std::queue<BaseMessage*> messages;
CriticalSection messagecs;
BaseMessage* Pop();
public:
void Push(BaseMessage* message)
{
auto scopedlock = messagecs.AquireScopedLock();
messagecs.push(message);
}
virtual void ActorFn() = 0;
virtual ~BaseActor() {} = 0;
}
Каждый из ваших процессов является экземпляром производного BaseActor. Акторы общаются друг с другом только посредством передачи сообщений (а именно, путем нажатия). Акторы регистрируются с помощью центральной карты при инициализации, которая позволяет другим участникам находить их, а также позволяет центральной функции проходить через них.
Теперь я понимаю, что я упускаю, или, скорее, замалчиваю здесь одну важную проблему, а именно: недостаток средств для получения один Актер может неоправданно отнимать слишком много времени. Но из-за кроссплатформенных сопрограмм Какая вещь, из-за которой это сложно в C ++? (В Windows, например, есть волокна.)
Но есть ли что-то еще, что мне не хватает, или модель действительно настолько очевидна?
Я определенно не пытаюсь начать здесь войну пламени, я просто хочу понять, что мне не хватает, поскольку это, по сути, то, что я уже делаю, чтобы иметь возможность рассуждать о параллельном коде.