老板工人模型设计

时间:2012-09-27 06:00:45

标签: c++ multithreading design-patterns worker-process

我正在使用Boss-Worker模型模式开发代码。我有个疑问。 Boss将添加的列表是Boss类的成员。 为了让Worker访问它,我使Worker类继承自Boss。

1)这是在Boss&和Boss之间分享列表的正确方法吗?工人?
2)我在代码中面临模糊的继承。我该如何解决?

ThreadClass

#include <pthread.h>
class ThreadClass
{
public:
    virtual int start();
    virtual void join();
    virtual void execute() = 0; //Each derived class will implement this
    virtual ~ThreadClass() {}
    ThreadClass() {}
private:
    ThreadClass* Tptr;
};

老板

#include "ThreadClass.h"
#include <list>

class Boss : public virtual ThreadClass
{
public:
    virtual void execute();
    Boss() {}   
    ~Boss() {}  

protected:
    std::list<int> Mylist;   //To be shared with the worker
};

工作人员

#include "ThreadClass.h"
#include "Boss.h"
class Worker : public Boss, public ThreadClass  //Getting error:Ambiguous ThreadClass
{
public:
    virtual void execute();
    Worker() {} 
    ~Worker() {}    
};

工人继承自Boss&amp; ThreadClass因为:

1)工人需要访问Boss中的列表 2)Worker需要ThreadClass中的线程函数

2 个答案:

答案 0 :(得分:2)

  

Boss将添加的列表是Boss类的成员。为了让Worker访问它,我使Worker类继承自Boss。

这绝对是一个类从另一个类继承的好理由。通常,Worker应该从Boss继承,当且仅当您可以在任何可以使用Worker的地方替换Boss时。从概念上讲,这不是这种情况。

如果您希望提供对Boss int列表的访问权限,那么,如果Worker知道Boss提供Boss的{​​{1}}或者(可能)使Worker成为friend的{​​{1}}。

如果您不希望Boss了解Worker,而是让Boss知道Boss s,那么请Worker将列表传递给Boss在施工时或在适当的时间之后。{/ p>

提供对某事物的访问并不是使一个类派生自另一个类的原因。

答案 1 :(得分:1)

我会将所有课程分开,并赞成作文。 WorkerBoss都可以通过对其进行引用来共享外部创建的列表。关于线程功能,C ++ 11和boost.thread方法是使线程类型采用“可调用”实体。我认为这种去耦方法比你提出的双重继承方法更清晰。

顺便说一句,您可能需要为此推出自己的并发列表类。如果不同的线程同时读取,std::list对于至少一个线程线程的写入是不安全的。

class ConcurrentList { .... };
class Boss
{
  ConcurrentList& list_;
 public:
  Boss(ConcurrentList& l) : list_(l)
  // other methods
};
class Worker
{
  ConcurrentList& list_;

 public:
  Worker(ConcurrentList& l) : list_(l)
  // other methods
};
class Thread
{
  // implement a call-cack mechanism
};