小编Jon*_*nks的帖子

演员模特:为什么erlang特别?或者,为什么你需要另一种语言呢?

我一直在研究学习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有光纤.)

还有什么我想念的,或者这个模型真的很明显吗?

我绝对不是想在这里开始一场火焰战争,我只想了解我所缺少的东西,因为这基本上就是我已经做过的能够在某种程度上推断并发代码的原因.

c++ concurrency erlang message-passing actor

74
推荐指数
4
解决办法
1万
查看次数

使用模板化参数的value_type

如何使用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)

c++ templates std

15
推荐指数
2
解决办法
2万
查看次数

seda和演员模型基本相同吗?

SEDA本质上是一组独立的"服务",它们通过队列相互通信,可以进一步抽象为消息传递.

actor模型是一组独立的函数,它们通过消息传递相互通信.

它们本质上不相同吗?我错过了一些关键的区别吗?

concurrency erlang message-passing actor

5
推荐指数
1
解决办法
1128
查看次数

将std容器传递给模板化类

为什么这不起作用?

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)

但这也不起作用.

c++ templates

2
推荐指数
1
解决办法
139
查看次数

标签 统计

c++ ×3

actor ×2

concurrency ×2

erlang ×2

message-passing ×2

templates ×2

std ×1