1
내가 그들에 대한 몇 가지 순열 bar
을 숫자 foo
의 일부 세트를 취득 해 수행하는 몇 가지 인터페이스가 있다고 가정 : 아무 문제가 없을 것, 구현이 단일 스레드 인 경우인터페이스에서 매개 변수의 스레드 안전성을 어떻게 요구합니까?
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
이 스레드로부터 안전해야한다는 것을 사용자가 이해할 수 있도록 어떻게 인터페이스를 수정할 수 있습니까?
AFAIK 그런 옵션이 없습니다. 함수 선언 근처에 적절한 주석을 달았습니다. –
'PerformParallellBar'로 이름을 바꾸시겠습니까? – Jarod42
문서에서 처리해야하는 것처럼 들립니다. 당신이 할 수있는 한가지 해킹 방법은 함수를 템플릿으로 만들고 나서 함수 이름을'SomeThreadSafeFunctionThatTakesAndReturnsDouble' – NathanOliver