2016-06-09 2 views
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이 스레드로부터 안전해야한다는 것을 사용자가 이해할 수 있도록 어떻게 인터페이스를 수정할 수 있습니까?

+0

AFAIK 그런 옵션이 없습니다. 함수 선언 근처에 적절한 주석을 달았습니다. –

+0

'PerformParallellBar'로 이름을 바꾸시겠습니까? – Jarod42

+0

문서에서 처리해야하는 것처럼 들립니다. 당신이 할 수있는 한가지 해킹 방법은 함수를 템플릿으로 만들고 나서 함수 이름을'SomeThreadSafeFunctionThatTakesAndReturnsDouble' – NathanOliver

답변

1

여기 BTW (옆으로 명백한 문서에서) 하나의 방법입니다 - 이것은 스케치가 아닌 컴파일 코드입니다 ..

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 
}; 
관련 문제