Я изучал изучение erlang и, как результат, читал (хорошо, скимминг) о модели актера.
Из того, что я понимаю, модель актера представляет собой просто набор функций (выполняемых в легких потоках, называемых "процессами" в erlang), которые общаются друг с другом только через передачу сообщений.
Это кажется довольно тривиальным для реализации на С++ или любом другом языке:
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. Актеры общаются друг с другом только посредством передачи сообщений. (а именно, нажатие). Актеры регистрируются с центральной картой при инициализации, которая позволяет другим игрокам находить их и позволяет выполнять центральную функцию.
Теперь, я понимаю, что мне не хватает, точнее, замалчивания одной важной проблемы здесь, а именно: отсутствие уступчивости означает, что один Актер может несправедливо потреблять чрезмерное время. Но являются ли кросс-платформенные сопрограммы главными, что делает это сложным в С++? (Windows, например, имеет волокна.)
Есть ли что-то еще, что мне не хватает, или действительно ли эта модель очевидна?
Я определенно не пытаюсь начать здесь пламенную войну, я просто хочу понять, чего мне не хватает, поскольку это, по сути, то, что я уже делаю, чтобы иметь несколько причин о параллельном коде.