2009-08-19 3 views
1

I는 다음과 같은 코드가 생성 :C++에서 스레드와 관련된 객체 인스턴스를 검색하는 방법은 무엇입니까? 자바

public class B { 
    public void exec(){ 
     X x = (X) Thread.currentThread(); 
     System.out.println(x.value); 
    } 
} 

public class X extends Thread{ 
    public int value; 

    public X(int x){ 
     value = x; 
    } 
    public void run(){ 
     B b = new B(); 
     b.exec(); 
    } 
} 

new X(4).start(); 

ㄴ 간부() 메소드는 현재 스레드 (X 클래스의 인스턴스도)에 대응하는 필드의 값을 검색한다.

C++에서 동일한 동작을 시뮬레이트 할 수있는 방법이 있습니까? 참고 : 코드가 생성되기 때문에 매개 변수로 x를 B 인스턴스에 전달하고 싶지 않습니다.

class B { 
public: 
    void exec(); 
}; 

class X { 
public: 
    int value; 
    X(int x) { 
     value = x; 
    } 
    void run() { 
     B * b = new B(); 
     b->exec(); 
    }  
}; 

void B::exec() { 
    std::cout << ??? << std::endl; 
} 

int main() { 
    X * x = new X(3); 
    boost::thread thr(boost::bind(&X::run, x)); 
    thr.join(); 
} 

스레드와 관련된 클래스 인스턴스를 검색하는 방법을 알지 못합니다. 어떤 아이디어입니까?

답변

2

boost::thread의 하위 클래스를 하위 클래스로 만들 수 없거나 하위 클래스를 생성 할 수없는 것은 사실입니다. 당신은 thread-local storage 자신의 스레드 특정 물건을 넣어 사용할 수 있습니다.

아마도 Java 코드에 대해 동일한 기술을 사용해야합니다. 자바는 그 목적으로 ThreadLocal을 가지고있다.

4

매개 변수를 B (가장 안전한 솔루션이었을 것임)에 전달하지 않으려면 스레드 로컬 저장소를 사용할 수 있습니다.

일반적으로 코드를 살펴보면 Java에서 C++ 로의 엄격한 1 대 1 매핑을 시도해 볼 수 있습니다.

C++에서는 거의 전화하지 말아야합니다. new. 가능할 때마다 스택에 할당하십시오. C++의 new은 분명히 오류가 발생하기 쉽지만 (가비지 수집이 없음) Java와 같은 관리되는 언어와 비교해도 매우 느립니다.

펑터는 함수 포인터 (예 : 스레드를 만들 때)의보다 강력한 대안으로 사용하거나 일반 exec() 또는 run() 기능을 대체하기 위해 사용할 수 있습니다. 대신 operator()으로 이름을 지정하면 해당 클래스를 Functor로 사용할 수 있습니다.

그리고 생성자에서 이니셜 라이저 목록을 가능한 많이 사용해야합니다.

다음은 위의 제안 사항을 코드에 적용한 것입니다. 물론 B 생성자에 인수를 전달했습니다. 옵션이 아닌 경우 thread local storage을 대신 사용하십시오.

class B { 
public: 
    explicit B(int value) : value(value) 
    void operator()(); 

private: 
    int value; 
}; 

class X { 
public: 
    int value; 
    X(int x) :value(x) { }// use the initializer list to initialize members 

    void operator()() { 
     B b(value); // allocate B on the stack if possible 
     b(); 
    }  
}; 

void B::operator()() { 
    std::cout << value << std::endl; 
} 

int main() { 
    boost::thread thr(X(3)); 
    thr.join(); 
} 

물론이 간단한 예제에서는 처음에는 실제로 두 클래스가 필요하지 않습니다. X을 완전히 삭제하고 완료하면 쉽게 완료 할 수 있습니다.

class B { 
public: 
    explicit B(int value) : value(value) 
    void operator()(); 

private: 
    int value; 
}; 

void B::operator()() { 
    std::cout << value << std::endl; 
} 

int main() { 
    boost::thread thr(B(3)); 
    thr.join(); 
} 
관련 문제