我一直在研究学习erlang,结果一直在阅读(好的,略读)演员模型.
根据我的理解,actor模型只是一组函数(在erlang中称为"processes"的轻量级线程中运行),它们只通过消息传递相互通信.
在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;
}
Run Code Online (Sandbox Code Playgroud)
每个进程都是派生的BaseActor的一个实例.演员只能通过消息传递相互通信.(即推).Actors在初始化时使用中心映射注册自己,允许其他actor找到它们,并允许中心函数运行它们.
现在,我明白我错过了,或者更确切地说,在这里掩盖了一个重要的问题,即:缺乏屈服意味着单个演员可以不公平地消耗过多的时间.但是跨平台协程是否会使C++难以实现?(例如,Windows有光纤.)
还有什么我想念的,或者这个模型真的很明显吗?
我绝对不是想在这里开始一场火焰战争,我只想了解我所缺少的东西,因为这基本上就是我已经做过的能够在某种程度上推断并发代码的原因.
如何使用std容器的value_type?
我试着像这样使用它:
#include <vector>
using namespace std;
template <typename T>
class TSContainer {
private:
T container;
public:
void push(T::value_type& item)
{
container.push_back(item);
}
T::value_type pop()
{
T::value_type item = container.pop_front();
return item;
}
};
int main()
{
int i = 1;
TSContainer<vector<int> > tsc;
tsc.push(i);
int v = tsc.pop();
}
Run Code Online (Sandbox Code Playgroud)
但这会导致:
prog.cpp:10: error: ‘T::value_type’ is not a type
prog.cpp:14: error: type ‘T’ is not derived from type ‘TSContainer<T>’
prog.cpp:14: error: expected ‘;’ before ‘pop’
prog.cpp:19: error: expected `;' before ‘}’ …Run Code Online (Sandbox Code Playgroud) SEDA本质上是一组独立的"服务",它们通过队列相互通信,可以进一步抽象为消息传递.
actor模型是一组独立的函数,它们通过消息传递相互通信.
它们本质上不相同吗?我错过了一些关键的区别吗?
为什么这不起作用?
template <typename T, typename U>
class TSContainer {
private:
U<T> container;
};
Run Code Online (Sandbox Code Playgroud)
称为:
TSContainer<int, std::vector> ts;
Run Code Online (Sandbox Code Playgroud)
我认为解决方案可能是:
template <typename T, template <typename> typename C>
class TSContainer
{
C<T> container;
};
Run Code Online (Sandbox Code Playgroud)
但这也不起作用.