客户端服务器没有可变状态?
我正在寻找函数式编程,并且正在努力争取一分。如何在没有可变状态的情况下执行以下操作?
想象一下,我有一台服务器......并且客户端尝试连接..并且每个客户端都会给服务器一个数字并获知当前的总数。
现在没有可变状态服务器不能保持总数...所以我认为每个客户端真的创建一个新的服务器包含一个新的总数..或一个新的服务器持有条目和引用旧的服务器,所以总数可以计算。
但是,客户端如何找到服务器? 有人必须坚持当前的服务器实例..所以他们有一个可变的变量'服务器'。
无论我做什么......我总是以一个可变变量作为最高范围。
思考?
你描述的场景可以像这样实现(伪代码):
let keepTrackOfTotal(total) =
let conn = waitForConnection()
let x = readIntFrom(conn)
let newTotal = total + x
writeIntTo(conn, newTotal)
keepTrackOfTotal(newTotal)
let main() = keepTrackOfTotal(0)
这里我们使用递归获得一个无限循环,记录总数,没有可变变量。
至少在Erlang中,它的工作方式是该进程本身有一个名称。
所以,虽然服务器循环不断启动自身的新版本(通过在调用结束时调用相同的函数,如在sepp2k的优秀伪代码中)并将总和作为参数提供,但所有客户端都会按名称联系该进程,所以他们仍然可以找到它。
像这样(在C ++上)。 我们有静态指针服务器,服务器对象的每个实例都是不可变的
#include <pthread.h>
#include <iostream>
#include <stdlib.h>
#include <memory>
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
class Server
{
public:
Server(int n) : m_n(n){}
static void Add(int n)
{
pthread_mutex_lock( &mutex1 );
std::auto_ptr<const Server> srv(getInstance());
server = new Server(srv->m_n + n);
pthread_mutex_unlock( &mutex1 );
}
static int GetTotal()
{
std::auto_ptr<const Server> srv(getInstance());
return srv->m_n;
}
private:
static const Server* getInstance()
{
if (server == NULL)
server = new Server(0);
return new Server(server->m_n);
}
static volatile const Server* server;
int const m_n;
};
volatile const Server* Server::server = NULL;
每次调用getInstance()都会返回不可变的Server对象。 当另一个线程在Add方法中工作时,您可以调用GetTotal()方法。
链接地址: http://www.djcxy.com/p/80839.html