我今天在办公室进行了一次有趣的讨论。假设我们有一个类应该提供一个接口来访问一些工作线程并给它一些工作(实际的东西有点详细,但我不认为细节是相关的。)
一种方法是拥有一个类:
class Manager
{
public:
void A(Work some_work)
{
//Synchronization mechanism
A_worker(some_work);
}
private:
A_worker(Work some_work);
}
可以说我们混合了在同一个类中运行在不同线程中的方法,但是类的用户永远不会陷入竞争状态。
另一种方法是:
class Manager
{
public:
void A(Work some_work)
{
//Synchronization mechanism
Manager_worker_pointer->InjectWork(some_work);
}
private:
ManagerWorker* Manager_worker_pointer;
}
class ManagerWorker
{
public:
void InjectWork(Work some_work);
}
可以说,ManagerWorker提供了一个可能导致竞争条件的公共接口,但我们并没有混合在同一个线程中运行的同一个类的方法。此类不应暴露在我们正在开发的组件中(或者可能是私有类定义)。
其中一个解决方案由我实施,然后我的经理抱怨说非常合适的解决方案是另一个。我不是在告诉哪一个不在答案中引入偏见。
实施此类界面时最好的方法是什么?第一个还是第二个?为什么?
EDIT。我看到这个问题被标记为基于意见。那么,这个问题是基于意见的,这将是一个有效的答案。因此,没有理由更喜欢一种方法而不是另一种方法。