2016-11-08 3 views
1

의 private 멤버로 사용 boost :: mutex를 private 멤버로 포함하는 클래스가 있습니다. 공용 함수 중 하나를 호출하면 해당 함수가 잠기고 함수가 종료되면 잠금이 해제됩니다. 이는 객체의 내부에 대한 동기 액세스를 제공하기위한 것입니다.boost :: mutex를 클래스

class StringDeque 
{ 
    boost::mutex mtx; 
    std::deque<string> string_deque; 
public: 
    StringDeque() { } 

    void addToDeque(const string& str_to_add) 
    { 
    boost::lock_guard<boost::mutex> guard(mtx); 
    string_deque.push(str_to_add); 
    } 

    string popFromDeque() 
    { 
    boost::lock_guard<boost::mutex> guard(mtx); 
    string popped_string = string_deque.front(); 
    string_deque.pop(); 
    return popped_string; 
    } 
}; 

이 클래스는 특별히 유용하지는 않지만 뮤텍스와 스레드로 놀고 있습니다.

클래스의 문자열을 팝하고 스레드에서 인쇄하는 또 다른 함수가 정의 된 main()이 있습니다. 이 작업은이 작업을 10 번 반복 한 다음 함수에서 돌아옵니다. 다시 한번 말하지만 이것은 테스트 목적으로 만 사용됩니다. 다음과 같이 보입니다.

void printTheStrings(StringDeque& str_deque) 
{ 
    int i = 0; 
    while(i < 10) 
    { 
     string popped_string = str_deque.popFromDeque(); 
     if(popped_string.empty()) 
     { 
     sleep(1); 
     continue; 
     } 
     cout << popped_string << endl; 
     ++i; 
    } 
} 

int main() 
{ 
    StringDeque str_deque; 
    boost::thread the_thread(printTheStrings, str_deque); 
    str_deque.addToDeque("Say your prayers"); 
    str_deque.addToDeque("Little One"); 
    str_deque.addToDeque("And Don't forget My Son"); 
    str_deque.addToDeque("To include everyone"); 
    str_deque.addToDeque("I tuck you in"); 
    str_deque.addToDeque("Warm within"); 
    str_deque.addToDeque("Keep you free from sin"); 
    str_deque.addToDeque("Until the sandman he comes"); 
    str_deque.addToDeque("Sleep with one eye open"); 
    str_deque.addToDeque("Gripping your pillow tight"); 
    the_thread.join(); 
} 

계속 오류가 발생하는 것은 boost :: mutex가 복사 불가능하다는 것입니다. printTheStrings() 함수는 참조를 사용하므로 객체를 복사하려는 이유가 다소 혼란 스럽습니다.

나는 이것에 대해 조금 읽었고 내가 읽고있는 한가지 해결책은 boost :: mutex를 객체의 정적 private 멤버로 만드는 것이다. 그러나 클래스 변수가 아닌 객체 단위로 사용하기를 원하기 때문에 이것은 내 뮤텍스의 목적을 무효화합니다.

이것은 뮤텍스의 잘못된 사용입니까? 이 전체 응용 프로그램을 다시 생각해야합니까?

편집 : 난 그냥 양단 큐에서 팝업을 인쇄 깨어 전에 양단 큐에서 실제로 무언가가있을 때까지 스레드 대기를 가지고 훨씬 더 내 목적을 제공해야하는 condition_variable 발견

. 모든 예제에서는 전역 범위에서 이러한 뮤텍스 및 condition_variable 개체를 정의합니다. 이것은 매우 보인다 ... 내 생각에 객체 지향적이지 않다. Boost에서 직접 나온 예제조차도이 방법으로 수행된다는 것을 보여줍니다. 이것은 정말로 다른 사람들이이 물건들을 사용하는 방법입니까?

+1

수업을 복사 할 수 없게하십시오. 'delete' 복사 생성자와 할당 연산자. –

+1

컴파일러 메시지를 다시 쓰지 말고 수정하지 않고 복사하여 붙여 넣습니다 (줄 번호 포함). 소스에 불쾌감을 줄 수 있음을 나타냅니다. –

+0

뮤텍스를 복사하지 않는 곳에 자신의 복사본 생성자를 정의하십시오. http://www.boost.org/doc/libs/1_61_0/doc/html/thread/thread_management.html#thread.thread_management.thread.callable_constructor –

답변

2

printToStringStringQueue을 참조로 사용합니다. 문제는 boost::thread이 (가) 인수별로 값을 지정한다는 것입니다. 참조로 인수를하도록 강제하려면 물건을 수정해야합니다 : C++ 11에서 여담으로

boost::thread the_thread(printTheStrings, boost::ref(str_deque)); 

을, 이후, 스레드가 표준 라이브러리의 일부입니다. 아마도 사용하셔야합니다 std::thread instead

+0

실험적인 형태로만 C++ 11을 지원하는 고대 컴파일러를 사용하고 있습니다. . –

+0

부스트를 사용하는 이유는 – doron

관련 문제