如何要求接口中参数的线程安全
How can I require thread-safety of parameters in an interface?
>假设我有一些接口,它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
};
相关文章:
- C++线程中,没有重载函数接受 X 参数
- C++ 中的线程不能使用参数
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- C++线程找不到函数作为参数(链接器)
- 如何将带有参数的方法传递给线程以执行?
- 为什么 beginthreadex 线程参数变量在父线程中没有更新
- 如何将参数传递给已经开始运行的线程
- 线程构造函数周围的可变参数模板包装器无法编译
- 线程函数中的c++参数更改
- 参数包推导不一致 int 和 int& 在可变参数模板化成员函数中创建运行成员函数的线程
- 线程函数参数的前向声明不起作用
- 带参数的线程调用库函数
- 错误:静态断言失败:std ::线程参数必须在转换为rvalues后不可行
- 从从可调用参数创建的线程对象参数移动构造 C++11 线程
- 错误 C2064:term 的计算结果不是采用 1 个参数的函数 - 关于线程的一些东西
- 通过将两个参数包的元素线程化为类型对来解压缩这两个参数包
- 提升线程:术语的计算结果不为 0 个参数
- C++线程错误 - 带有类参数的编译时错误
- 在 C++11 中,如何不将参数传递给线程
- 在单独的线程中使用参数启动成员函数