1

나는 다음과 같은 코드가스레드 현대 접근

#include <iostream> 
#include <boost/thread/thread.hpp> 
#include <vector> 

using namespace std; 
using namespace boost; 

class background_task 
{ 
private: 
    std::vector<int> numbers; 

public: 
    background_task() 
    { 
     i=0; 
     numbers.assign(6000,0); 
    } 

    void someLongComputation() 
    { 
     while (++i<200) 
     { 
      //boost::mutex::scoped_lock(formutex); 
      // cout << "Thread inside: i= " << this->i << endl; 
      numbers.at(0)=i; 
      cout << "Thread inside numbers= " << numbers.at(0) << endl; 
      boost::this_thread::sleep(boost::posix_time::milliseconds(100)); 
     } 
    } 

    std::vector<int>& getNumbers() 
    { 
     return numbers; 
    } 

    int i; 
}; 

background_task f; 

void valuePicker() 
{ 
    int j=0; 
    while ((j++) < 20) 
    { 
     boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); 
     cerr << "First number= " << f.getNumbers().at(0) << endl; 
    } 
} 

int main(void) 
{ 
    boost::thread comp(boost::bind(&background_task::someLongComputation, &f)); 
    boost::thread value(valuePicker); 

    comp.join(); 
    return 0; 
} 

이 코드는 두 개의 스레드를 시작해야 맞다면 이해하려는 : someLongComputation하게 하나 (필자는 loooong 계산을 시뮬레이션하기 위해 타이머 침대를 추가 실제로는 매우 짧음)와 계산 스레드에 포함 된 데이터와 다른 빈도로 액세스하는 다른 스레드가 있습니다.

mutexes가 필요하지 않은 것처럼 보이기 때문에이 접근법이 올바른지 궁금합니다. 뭔가 빠뜨린 것 같아서이 코드를 스레드로부터 안전하고 올바르게 만드는 방법을 묻습니다. ..

const가 아닌 참조를 전달하는 것이 맞습니까? 아니면 const로 만드는 것이 더 안전합니까? 작성된 데이터는 쓰여서는 안되며 읽기 전용입니다 ...

고마워요! 이 쓰레드로 마침내 멀티 쓰레딩에 대한 나의 초보자들의 의구심을 해결할 수 있기를 바랍니다 ...

+1

스레드 안전성은 수치로 측정되는 것이 아닙니다 –

답변

0

공유 배열 읽고 쓰는 것은 스레드로부터 안전하지 않습니다. 삽입 한 인공 sleep은이 코드가 실제로 성공적으로 실행되고있는 경우 문제를 가릴 가능성이 높습니다.

벡터 주위에 적절한 보호가 필요합니다.이 벡터를 공개 함수 getNumbers()을 통해 클라이언트에 노출하기 때문에 정확한 예가 주어지면 매우 어렵습니다. 이렇게하면 background_task의 클라이언트가 실제로 데이터와 상호 작용하는 방식을 반드시 제어 할 수는 없습니다.

(길이 계산 기능에서 이미 주석 처리 했으므로) boost::mutex을 추가하고 (잠금 범위를 작게 유지하기 위해 배열에 액세스 할 때만) 긴 계산 기능에서 잠글 수 있습니다. 또한 getNumbers() 함수를 제거하고 특정 인덱스 (예 : int getNumberAt(size_t idx);)의 배열에서 값을 가져오고 boost::mutex을 잠그는 함수로 바꿉니다.

+0

내 실제 코드 (이것은 단순한 추상화입니다)에서 전체 벡터 에 대한 읽기 권한을 갖고 싶습니다. 어떻게 올바르게 수행 할 수 있습니까? – linello

+0

전체 벡터에 대한 읽기 액세스 권한이 필요한 경우 유일한 안전한 옵션은 뮤텍스를 공개하고 API (및 개발자 교육)를 통해 뮤텍스를 잠글 때 벡터에 액세스 할 때마다 강제로 수행하고 완료되면 잠금을 해제하는 것입니다 . 이것은 훨씬 더 많은 위험을 초래합니다. – Chad

관련 문제