2010-12-01 3 views
2

스레드와 바인드 상호 작용에 약간의 문제가 있습니다.C++ Bind를 사용하여 스레드를 생성 할 때 문제가 발생했습니다.

그것은 간단하다, 지금 모든 것이 괜찮아 잘 때까지,이 상황을

class myclass { 
    // ... 
    // ... 
    void dosome(); 
    void doanother(myclass2, myclass3*); 
    void run() { 
     this->_myt = boost::shared_ptr<boost::thread>(
     new boost::thread(boost::bind(&myclass::dosome, this))); 
    } 
    // ... 
    boost::shared_ptr<boost::thread> _myt; 
    //... 
}; 

확인을해야합니다. 바인드는 함수 또는 함수 포인터를 일부 값 이상, 일부 인수 값에 바인딩 할 수 있음을 이해합니다. myclass 객체에서 function()을 호출하면 새 스레드가 시작됩니다. 질문 : 왜 함수 bind가 어떤 매개 변수도 사용하지 않을 때, 바인드가 실행 중에 매개 변수를 취하는 이유는 무엇입니까? 그것은 클래스 함수에 대해 클래스에 대한 포인터 인 암시 적 인수가 항상 있기 때문입니다.

정상적으로 이것은 내 유일한 문제가 아닙니다. 내 첫 번째 스레드의 실행 흐름이다 내부 dosome, 나는이 작업을 수행 :

void myclass::dosome() { 
    myclass2 m; 
    myclass3* x = new myclass3; 
    boost::shared_ptr<boost::thread>(new boost::thread( 
     boost::bind(&myclass::doanother, m, x, this))); // Line X 
} 

그럼 내가 다른 스레드를 간부 인 싶어. 첫 번째 질문 : shared_prt는 스마트 포인터입니다. 즉, dosome()이 exec 흐름에서 벗어나면 해당 범위에서 실행 한 스레드가 지속되어 shared_ptr이됩니다. 이것이 올바른지 말해주세요. 두 번째 질문 : 컴파일러는 줄 X의 명령어에 대해 정말로 화를냅니다. 문제는 바인드입니다. 아마도 내가 통과 한 것이 마음에 들지 않습니다 ... 이유는 무엇입니까? 이것은 멤버 함수입니다 (나는 doanother에 대해 이야기합니다). 그리고 두 개의 인자가 더해졌습니다 ... 어디에 문제가 있습니까?

가 부스트 :: 바인드 '이'첫 번째 매개 변수입니다 들어 당신에게

+0

코드를 선택하고 Ctrl + K를 눌러 코드를 포맷하십시오. 미리보기를 사용하십시오. – EboMike

답변

4
  1. 을 생각할 수있는 매개 변수로 ... 다음 멤버 함수에 대한 포인터 및 다음 개체를합니다. 또는 bind처럼 something->your_member()과 같은 멤버 함수를 호출해야하므로 something이 무엇인지 말해야합니다.

  2. 두 번째 예제에서는 shared_ptr을 아무 것도 저장하지 않으므로 두 번째 예제에서는 만든 후 즉시 삭제됩니다. 스레드 객체가 가리키는 스레드 객체도 파괴됩니다. 그러나 스레드의 실행 자체가 스레드 개체에 바인딩되지 않으므로이 정확히 같은 방식으로 작동합니다

    void myclass::dosome() { 
        myclass2 m; 
        myclass3* x = new myclass3; 
        boost::thread(boost::bind(&myclass::doanother, this, m, x)); // Line X 
    } 
    

    이 새로운 스레드를 시작하고 당신의 코드에서처럼 그것을 푼다. 스레드가 계속 실행됩니다.

  3. 위에서 보았 듯이 this은 바인딩 할 두 번째 매개 변수로 전달되어야합니다.

+0

예 이제 작동합니다. 고맙습니다. – Andry

2

감사 (또는 오히려 MyClass에의 첫 번째 매개 변수 : doanother 것은 '이'입니다) :

boost::bind(&myclass::doanother, this, m, x) 

이유 실행 중에 바인드합니까? 함수 dosome이 매개 변수를 사용하지 않을 때이 매개 변수를 사용합니까?

모든 클래스 메서드에는 'this'라는 첫 번째 매개 변수가 있으므로 입력 할 필요가 없으며 컴파일러에서 자동으로 추가합니다. 클래스의 각 인스턴스는 동일한 코드를 사용하지만 자체 멤버 변수가 있습니다. 'this'매개 변수는 메서드에서 사용할 멤버 변수에 대한 포인터입니다.

다른 스레드에서이 바인딩에 정말로 바인딩 되길 원하십니까? 그것은 다중 스레드가 가능할 수있는 동일한 인스턴스의 멤버 변수에 액세스 할 수 있음을 의미하지만 아마 그렇게 할 수는 없습니다.

0

봅니다

이 잘 나는 다른 스레드를 간부 인 싶어 .. 부품에 응답합니다. 첫 번째 질문 : shared_prt는이 dosome은() 가있는 shared_ptr되고, 그 간부 흐름에서이 가 지속됩니다 그 범위 내에서 실행 스레드를 얻을 수 ... 말해 주시기 바랍니다이 있다는 것을 의미, 스마트 포인터 옳은.

이 객체에 대한 다른 참조가 없으므로 shared_ptr이 범위를 벗어나면 스레드 객체가 삭제되고 모든 종류의 쓰레기가 발생할 수 있습니다.둘째

, boost::bind 당신은 암시 적 매개 변수로의

관련 문제