Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将线程逻辑与业务逻辑分离?_C++_Multithreading_Unit Testing_Tdd - Fatal编程技术网

C++ 将线程逻辑与业务逻辑分离?

C++ 将线程逻辑与业务逻辑分离?,c++,multithreading,unit-testing,tdd,C++,Multithreading,Unit Testing,Tdd,将线程逻辑与业务逻辑结合起来是常见的做法吗?我问的是测试驱动开发,想知道测试与线程逻辑相关的商业智能是否有好处/缺点。考虑下面, class Thread { ... } class FooThread : public Thread { /* business intelligence coupled to threading */ } 或者 这些方法似乎有点不利于在测试类时抽象掉依赖项。是否可以/可以改为设计一个可以与线程完全解耦的类,也许可以使用模板 template<clas

将线程逻辑与业务逻辑结合起来是常见的做法吗?我问的是测试驱动开发,想知道测试与线程逻辑相关的商业智能是否有好处/缺点。考虑下面,

class Thread { ... }
class FooThread : public Thread {
  /* business intelligence coupled to threading */
}
或者

这些方法似乎有点不利于在测试类时抽象掉依赖项。是否可以/可以改为设计一个可以与线程完全解耦的类,也许可以使用模板

template<class SomeFooClass>
class Thread { ... }

class Foo { 
  /* this class can be tested separately */
}

typedef Thread<Foo> FooThread;
模板
类线程{…}
类Foo{
/*这个类可以单独测试*/
}
typedef螺纹-足螺纹;

这有什么好处/缺点吗?这种方法是否可以用于将业务逻辑与其他常见设计模式分离?

线程和其他计算效果往往会让单元测试作者头疼。如果可以,请将线程管理封装在测试中的业务逻辑之外

如果您正在寻找如何实现这一点的想法,请考虑创建一个表示线程可能执行的工作的类型(该类型可以是一个函子、完整的类,或者可能只是一个函数指针)。 将您的“纯”业务逻辑放在这个“可运行”类型的实例中,并在这个接口上测试它。然后,您可以实现一个可重用的线程池,该线程池(比如)在队列中接受这些可运行项并执行每个可运行项。这种模式可能有很多变化;我建议在boost库中查找现有的实现


这种分离通常不会使您免于同步的负担,这通常是一个跨领域的问题。锁有一种滑入其他干净业务逻辑的方式。您可以尝试通过模拟它们来处理它们,或者尝试通过序列化访问(例如使用专用的“代理”线程和一个可运行队列)来完全消除锁定(基于具体情况)。

将线程与业务逻辑分离以测试纯业务逻辑的意义难道不在于此吗?为什么要测试“runnable”接口,或者这与耦合到其底层线程的类有何不同?runnable接口应该是纯代码。如果您愿意,您当然可以自由地在下面进行测试。如果您试图证明辅助线程正在执行正确的步骤序列(而不是证明它所操作的对象本身是正确的)然后,runnable充当worker将执行的操作的干净容器。因此,runnable基本上是可传递到单独线程对象并由其执行的类型的公共接口?是的。这不是一个新的想法;正如我所说,看看boost,看看它们为您提供了什么。@jwalk一个可运行的类不必在线程中运行。想象一下,在单线程情况下收集更新以供以后运行,即观察者/侦听器模式。
template<class SomeFooClass>
class Thread { ... }

class Foo { 
  /* this class can be tested separately */
}

typedef Thread<Foo> FooThread;