如何要求接口中参数的线程安全

How can I require thread-safety of parameters in an interface?

本文关键字:参数 线程 安全 接口      更新时间:2023-10-16

>假设我有一些接口,它foo接受一组数字,并对它们执行一些排列bar

class Interface
{
public:
  virtual std::vector<double> PerformBar(const std::vector<double>& foo) = 0;
  virtual void SetBar(std::function<double(double)>&& func) = 0;
};

如果实现是单线程的,则不会有问题,但是如果我的实现尝试并行化其任务怎么办?

class Impl final : public Interface
{
public:
  std::vector<double> PerformBar(const std::vector<double>& foo) override
  {
    std::vector<double> result(foo.size());
    std::thread t1([&]()
      {
        for (int i = 0; i != foo.size() / 2; ++i)
          result[i] = bar(foo[i]);
      });
    std::thread t2([&]()
      {
        for (int i = foo.size() / 2; i != foo.size(); ++i)
          result[i] = bar(foo[i]);
      });
    t1.join();
    t2.join();
    return result;
  }
  void SetBar(std::function<double(double)>&& func) override
  {
    bar = func;
  }
private:
  std::function<double(double)> bar;
};

目前,我的接口没有向用户明确说明func应该是线程安全的,也没有强制实现假设它不是线程安全的。

除了添加注释之外,如何修改我的界面以确保用户理解func必须是线程安全的?

顺便说一句,这是一种方法(除了明显的文档) - 这是一个草图,而不是编译代码。

template <typename MutexType>
class Interface {
public:
  std::vector<double> PerformBar(const std::vector<double>& foo) {
    // Lock the mutex
    return DoPerformBar(foo);
  }
  void SetBar(std::function<double(double)>&& func) {
    // Lock the mutex
    return DoSetBar(forward(func));
  }
protected:
  virtual std::vector<double> DoPerformBar(const std::vector<double>& foo) = 0;
  virtual void DoSetBar(std::function<double(double)>&& func) = 0;
private:
  MutexType mutex_;
};
class SingleThreadedImpl final : public Interface<boost::interprocess::null_mutex>
{
protected:
  // Do the protected methods
};
class ParallelImpl final : public Interface<std::mutex>
{
protected:
  // Do the protected methods
};