2016-09-19 2 views
7

클래스 내에서 스레드를 사용하려고 시도하면 스레드가 condition_variable을 사용해야하며 조건 변수는 술어는 true으로 변경됩니다. 코드는 다음과 같습니다 컴파일에내 클래스의 조건부 변수 대기열 조건 :: std :: thread <unresolved overloaded function type> 오류

class myThreadClass{ 
    bool bFlag; 
    thread t ; 
    mutex mtx; 
    condition_variable cv; 

    bool myPredicate(){ 
     return bFlag; 
    } 

    int myThreadFunction(int arg){ 
     while(true){ 
      unique_lock<mutex> lck(mtx); 
      if(cv.wait_for(lck,std::chrono::milliseconds(3000),myPredicate)) //something wrong? 
       cout<<"print something...1"<<endl 
      else 
       cout<<"print something...2"<<endl 
     } 
    } 

    void createThread(){ 
     t = thread(&myThreadClass::myThreadFunction,this,10);//this is ok 
    } 

} ; 

이 코드라는 오류가 발생합니다 : 라인 "wait_for"에

해결되지 않은 오버로드 된 함수 타입을.

그때 나는 그것을 수정하려고 :

if(cv.wait_for(lck,std::chrono::milliseconds(3000),&myThreadClass::myPredicate)) 

하지만 오류가 여전히 존재한다.

+2

'(cv.wait_for (lck, std :: chrono :: milliseconds (3000), [this] {return myPredicate();}))' – ildjarn

+0

술어 사용이 잘못되었습니다. 그것은 술어를 사용할 수없는 방법입니다. –

답변

4

술어는 컨텍스트없이 호출 가능해야합니다. 작동시킬 오브젝트가 필요한 비 정적 클래스 멤버에서이 함수를 호출하려고합니다.

당신은 개체의 컨텍스트를 캡처하고 적절한 형태로 함수 호출을 래핑하는 람다 함수를 사용할 수

const std::chrono::milliseconds timeout(3000); 
if(cv.wait_for(lck, timeout, [this]{ return myPredicate(); })) 
    // ... 

만 때문에 조건 변수의 myPredicate을 만든 경우, 당신이 그것으로 멀리 할 수 ​​있으며, 그냥 사용 ..

if(cv.wait_for(lck, timeout, [this]{ return bFlag; })) 
2

예, 사실이 작업을 수행하는 가장 좋은 방법은을

auto myPredicate = [this]{ return bFlag; } 

다음

if (cv.wait_for(lck, std::chrono::milliseconds(3000), myPredicate)) 

당신이 myPrediate 방법을 제거 할 수있는이 방법을 사용.

4

술어과 같은 (a에 대한) 멤버 함수는 개체를 호출해야하므로 적절하지 않습니다. 따라서 멤버 함수를 개체에 바인딩하여 만들려면 래퍼가 필요합니다. 비교할 두 값만 호출 할 수 있습니다.

는 C++ 11에서는 객체에 멤버 함수를 바인딩 할 수 있습니다 : 당신이 바인딩에 자리를 사용할 수 있습니다

class myThreadClass{ 

bool bFlag; 
thread t ; 
mutex mtx; 
condition_variable cv; 

bool myPredicate(){ 
    return bFlag; 
} 

int myThreadFunction(int arg){ 
    while(true){ 
     unique_lock<mutex> lck(mtx); 
     if(cv.wait_for(lck,std::chrono::milliseconds(3000),std::bind(&myThreadClass::myPredicate,this))) //something wrong? 
      cout<<"print something...1"<<endl; 
     else 
      cout<<"print something...2"<<endl; 
    } 
} 

void createThread(){ 
    t = thread(&myThreadClass::myThreadFunction,this,10);//this is ok 
} 
}; 

.

또는 람다 함수를 사용할 수 있습니다.