ams*_*mso 9 c c++ multithreading design-patterns class-design
我正在寻找C或C++中的这个问题的解决方案.
编辑:澄清.这是在Linux系统上.特定于Linux的解决方案绝对没问题.跨平台不是一个问题.
我有一个在自己的线程中运行的服务.这个服务是一个有几个方法的类,其中一些方法需要在自己服务的线程中而不是在调用者的线程中运行.
目前我正在使用包装器方法创建具有输入和输出参数的结构,将结构插入队列并返回(如果"命令"是异步的)或等待其执行(如果"命令"是同步的).
在线程方面,服务唤醒,从队列中弹出一个结构,找出要执行的内容并调用适当的方法.
这个实现有效,但添加新方法非常麻烦:定义包装器,带参数的结构和处理程序.我想知道是否有一种更简单的方法来编写这种模型:一种类方法,它在类自己的线程上执行,而不是在调用者的线程中执行.
编辑 - 一种结论:
 
似乎没有事实上的方法来实现我所要求的,不涉及额外的编码工作.
我会坚持我提出的方法,它确保类型安全,最小化锁定,允许同步和异步调用以及相当适度的开销.
另一方面,它需要一些额外的编码,并且随着方法数量的增加,调度机制可能变得臃肿.在构造上注册调度方法,或者让包装器执行该工作似乎可以解决问题,消除一些开销并删除一些代码.
小智 1
有多种方法可以实现此目的,具体取决于您想要接受的复杂性。代码的复杂性与所需的灵活性成正比。这是一个简单的(并且使用得很好):
定义与服务器公开的每个功能相对应的类。这些类中的每一个都实现了一个名为execute的函数,并采用一个名为输入参数和输出参数的基本结构。
在服务内部,在初始化时注册这些方法类。一旦请求到达线程,它将只有两个参数,输入和输出,它们是不同方法类所需的更专业参数的基类。
然后,您将服务类编写为纯粹的委托,它接受传入请求并根据 ID 或方法名称(在初始注册期间使用)传递到相应的方法类。
我希望它有意义,这种方法的一个很好的例子是 XmlRpc++(XmlRpc 的 C++ 实现,你可以从 sourceforge 获取源代码)。
回顾一下:
struct Input {
  virtual ~Input () = 0;
};
struct Ouput {
  virtual ~Output () = 0;
};
struct MethodInterface {
   virtual int32_t execute (Input* __input, Output* __output)  = 0;
};
// Write specialized method classes and taking specialized input, output classes
class MyService {
  void registerMethod (std::string  __method_name, MethodInterface* __method);
  //external i/f
  int32_t execute (std::string __method, Input* __input, Output* __output);
};
您仍将使用队列机制,但不需要任何包装器。
| 归档时间: | 
 | 
| 查看次数: | 10524 次 | 
| 最近记录: |