通信基于套接字,它是保持连接的。用户使用帐户名登录,我需要在两个用户使用同一帐户登录时实现一项功能,前者需要启动。 代码需要更新:
void session::login(accountname) // callback when server recv login request
{
boost::shared_ptr<UserData> d = database.get_user_data(accountname);
this->data = d;
this->send(login success);
}
boost::shared_ptr<UserData> Database::get_user_data(accountname)
{
// read from db and return the data
}
最简单的方法是改进Database :: get_user_data(accountname)
boost::shared_ptr<UserData> Database::get_user_data(accountname)
{
add a boost::unqiue_lock<> here
find session has same accountname or find user data has same accountname in cache,
if found, then kick this session offline first, then execute below codes
// read from db and return the data
}
此修改有两个问题:
1,并发性太差,因为场景很少发生。但是,如果我需要在线检查帐户,我必须将其缓存在某处(用户数据或会话),这意味着我需要写入一个容器,该容器必须具有独占锁定,无论帐户是否相同。因此,并发性几乎无法改善。
2,通过在“this thread”中调用“other_session-&gt; offline()”来启动另一个,这可能与同时在其他线程中执行的其他操作同时发生。 如果我在offline()中添加锁定,那将导致所有其他属于session的函数也需要添加那个锁,显然,不好。或者,我可以将事件推送到other_session,并让other_session处理事件,这将确保在其自己的线程中“脱机”执行。但问题是离线执行异步,“脱机”下面的代码必须在“离线”运行完成后执行。
我使用boost :: asio,但我尝试共同描述这个问题,因为我认为这是服务器编写中的常见问题。有没有解决这个问题的模式?请注意,当同时有N个相同的帐户登录时,此问题会变得复杂
答案 0 :(得分:0)
如果这种情况很少发生,我不会担心。锁定和释放互斥锁不是用户会注意到的长动作(如果你每秒必须做几千次这可能是一个问题)。
一般来说,尝试解决不存在问题的性能问题。