什么方法来保持模块之间的数据一致性?

时间:2014-12-27 14:37:02

标签: c++ linux multithreading synchronization consistency

通常,如果我们有许多资源由单个模块拥有并由许多线程修改,并且我们希望在这些线程之间保持数据一致性,那么一种方法是使用锁。

但是,当资源分配到多个模块时,这似乎是不可能的。例如,假设我们有三个模块,它们是 SocketsLayer,SessionLayer,FileTransferLayer 。以及其他一些假设:

  1. SocketsLayer
    维护所有(非阻塞)插座;
    使用一个线程来收听和读取套接字;
    关闭时使用相同的线程删除套接字,并异步通知 SessionLayer

  2. 会话层
    为每个用户创建一个会话;
    每个用户都有一个名为CmdChannel的套接字用于发送/接收命令;
    每个用户都有几个名为DataChannel的套接字,用于发送/接收文件数据;
    每个(用户名,cmd套接字,数据套接字)称为会话 一旦套接字被注册为USER的CmdChannel,就会创建该用户的会话 一旦CmdChannel关闭或损坏,拥有它的Session变为无效(BE DELETED) 会话失效后,所有数据套接字都无效 使用一个线程来创建会话和删除会话。

  3. FileTransferLayer
    每个用户都有几个文件传输任务;
    每个文件传输任务都有自己的数据套接字;
    所有任务属于一个用户共享一个命令套接字;
    一旦用户的会话失效,必须删除属于该用户的任务 使用一个线程来创建任务和删除任务。

  4. 假设正在为 SomeUser (由 SessionLayer 处理)注册一个cmd频道,现在 SessionLayer 将创建一个会话此用户。但是,如果在创建会话期间此对象已关闭此cmd套接字,该怎么办?

    更新
    SocketLayer 中的套接字 SessionLayer 中的会话以及 FileTransferLayer <中的任务 / strong>,所有这三类数据属于同一用户必须保持一致。但是它们由不同的模块拥有,那么如何在这三个模块之间保持数据的一致性呢?

0 个答案:

没有答案