2010-05-03 4 views
4

전송 데이터를 효율적으로

내가 3 개 클래스, 관리자 2 포인터를 보유하고이 ... 도움이 필요합니다. 하나 대 클래스 다른 클래스 B. B을 알지 못합니다.

일부 계산을하고 결국에는 3 개의 부동을 클립 보드에 넣습니다. 다음으로 B은 클립 보드에서 3 개의 부동을 가져오고 자체 계산을 수행합니다. 이 루프는 관리자에 의해 관리되며 여러 번 반복됩니다 (반복 후 반복).

내 문제 : 이제 클래스 는 클래스 B 요구 수레의 벡터를 생성합니다. 이 벡터는 1000 개가 넘는 값을 가질 수 있으며 클립 보드를 사용하여 B으로 전송하는 것을 원하지 않습니다.이 동작은 단계적으로 반복되기 때문에 시간 소비가되고 병목 현상이 발생할 수도 있습니다.

간단한 솔루션은 B이 (에 대한 포인터를 설정) 알 것입니다. 다른 하나는 관리자를 통해 벡터에 대한 포인터를 전송하는 것입니다 하지만, 다른 무언가를 찾고 있어요 더 B

모든 아이디어를 사이에 존재 분리를 중단하지 않습니다 객체 지향 ?

많은 감사

데이비드

답변

9

당신이 이상 더 쉽게 의사 소통을 할 수있다 생산자/소비자 쌍 (아마 스레드 안전) 큐 수레의을 작성하는 것 종류의 소리.

즉, "대기열"은 현재 사용중인 벡터와 같습니다. A와 B 모두이 대기열에 대한 참조를 갖습니다. A는 계산을 실행하고 수레를 대기열에 씁니다 (필요한 경우 한 번에 3 개). B는 대기열을 검사하거나 대기열이 준비되었음을 "A"에 의해 "신호 화"되고 대기열에서 부동을 처리하여 대기열을 처리합니다.

더 많은 정보 구글

(또는 스택 오버플로 검색) "생산자 소비자" 및/또는 "큐"를 들어, 당신은 아마 유용한 정보를 많이 찾을 수 있습니다.

(예컨대 Multithreaded Work Queue in C++)

+0

감사합니다. 그건 내가 '클립 보드'로 오늘하고있는 일입니다. 문제는 지금 약 1000 값의 벡터를 전송해야합니다. 그 값을 클립 보드에 쓰고 다시 읽는 것은 시간이 많이 걸립니다. 응용 프로그램이 많은 계산을하는 수학 응용 프로그램이고 큐에 데이터를 전송하지 않는 계산에 CPU 시간을 절약해야하는 CPU 인접한 의미입니다. – David

+0

당신은 ' 큐마다 데이터를 전송해야합니다. 대기열의 데이터를 직접 사용할 수 있습니다. 성능이 중요한 경우 병목 현상을보기 위해 코드를 프로파일 링 했습니까? 나에게 인접한 CPU는 "캐시에서 직접 작업 해보십시오."라고 제안합니다. 특히 이질적인 멀티 코어 하드웨어에서 작업하는 경우에는 매우 어려울 것입니다. –

+0

A와 B가 인터리브 처리되므로, threadsafe 큐의 오버 헤드가 잘못 배치 된 것처럼 보입니다. 물론, 별도의 스레드에서 A와 B를 실행하는 것이 효과적 일 수 있습니다 (두 계산이 모두 크로스 스레드 동기화보다 훨씬 비싸다). – MSalters

1

벡터를 만들고 반복에서와 B "참조에 의해 전달"을 사용하여 전달합니다.

3

clipboard is a crazy way은 두 엔터티간에 데이터를 전송합니다.B는 IConsumer 같은 일반적인 인터페이스를 구현하는 경우

는 관리자는이 인터페이스를 통과 할 수 A는 페이로드와 직접 B의 메소드를 호출 할 수 있습니다 : 문제가 해결

class IConsumer { 
public: 
    virtual void consume(const vector<float>& data) = 0; 
}; 

class B: public IConsumer { 
public: 
    virtual void consume(const vector<float>& data) { ... } 
    ... 
}; 

class A { 
public: 
    virtual void produce(IConsumer& consumer) { 
     vector<float> data; 
     ... 
     consumer.consume(data); 
    } 
    ... 
}; 

void Manager::tick() { 
    a->produce(*b); 
} 
0

당신이 실현되면 그 어느 class Aclass B은 공유 데이터 저장소를 관리하기 위해 tyring해야하며 어느쪽에도 독점적이지는 않습니다. 따라서 Manager이 그렇게해야한다고 가정하는 것이 옳습니다. 이 간접 수준을 절약 할 최적의 성능을 위해

는, 원시 float* 대신 A와 B 패스 벡터에 대한 포인터 를 전달하지 않습니다. 타협은 지적 된 바와 같이이 boost::array &

0

, 당신은 단지 다른 스레드에서 실행되지 않는 AB 한, 공유 스토리지와 같은 std::vector<float>을 사용할 수 있습니다 통과하는 것입니다. Manager은이 저장 용량을 관리 할 수 ​​있습니다. A이 작업을 시작하면 해당 벡터의 결과를 저장하는 범위를 요청할 수 있습니다. 완료되면 ManagerB을 호출하고 방금 값으로 채운 범위에 A을 건네줍니다. 이렇게하면 복사를 피할 수 있습니다.

관련 문제