2012-02-13 6 views
2

저는 C++ 0x에서 몇 가지 기본 스레딩을 사용하여 작업 속도를 향상 시켰습니다. 시험 속도를 제외하고는 아무 것도하지 않는 간단한 예제의 경우 :객체 지향 C++ 멀티 스레딩

void my_thread_func(int n, int steps, int offset) 
{ 
    double a[n]; 
    for (int i=0; i<n; i++) 
    a[i] = i + offset; 
    for (int step=0; step<steps; step++) 
    for (int i=0; i<n; i++) 
     a[i] = sin(a[i]); 
} 

int main() 
{ 
    std::vector<std::thread> t; 
    for (int i=0; i<numRuns; i++) 
    t.push_back(std::thread(my_thread_func, n, steps, i)); 
    for (int i=0; i<numRuns; i++) 
    t[i].join(); 
} 

그리고 꽤 잘 작동합니다. 제 질문은 다소 일반적인 것입니다. 즉, 위의 아이디어를 회원 기능을 사용하여 일반화하는 방법입니다. 로프가 10 개 있다고 가정하면 각 로프에는 computeTorques(), computeForces() 등 여러 멤버 함수가 있습니다. 로프가 메모리/리소스를 공유하지 않는다고 가정하면 각 로프의 각 멤버 함수를 멀티 스레드로 호출 할 수 있습니다 (명시 적으로 로프 내에서 (단일 스레드) 코드를 변경하지 않아도됩니까?

+0

이것은 개체 구현에 따라 다릅니다. –

답변

3

std::bind을 사용하십시오.

class Rope 
{ 
    ... 
    void compute(); 
}; 

int main() 
{ 
    Rope ropes[10]; 
    std::vector<std::thread> t; 

    for(auto& r : ropes) 
     t.push_back(std::thread(std::bind(&Rope::compute, &r))); 

    for(auto& th : t) 
    th.join(); 
} 

EDITED : 람다 사용이 더 좋습니다.

for(auto& r : ropes) 
     t.push_back(std::thread([&]{ r.compute(); })); 
+0

std :: futures와 일종의 스레드 풀을 사용하는 것이 훨씬 더 좋을 것입니다. – Lalaland

+1

for (auto & th : t) th.join(); – CashCow

+0

@Ethan Steinberg : 선물은 관심있는 특정 계산 된 값일 때 유용합니다. sin() 함수의 결과에 관심이 있다면 좋을 것입니다. 스레드가 단지 미래를 사용하지 않는 무언가를하는 일반적인 경우. – CashCow

0

완전히 개체 구현에 따라 달라집니다.

일부 개체의 경우 안전 할 수 있으며 다른 것들은 문제가있을 수 있습니다.

+0

멤버 함수를 호출하는 구문이 어떻게 될지는 모르겠습니다. 간단한 예제를 제공해 주시겠습니까? – andyInCambridge