2010-06-29 2 views
4

내 문제는, 나는 여러 스레드에 의해 업데이 트 블록 매트릭스 있습니다. 여러 스레드가 한 번에 분리 블록을 업데이트 할 수 있지만 일반적으로 경쟁 조건이있을 수 있습니다. 지금 매트릭스는 단일 잠금을 사용하여 잠겨 있습니다.부스트 스레드 뮤텍스 배열

효율적으로 잠금 배열을 구현하여 한 번에 한 행씩 만 잠글 수 있도록하는 것이 좋습니다.

문제의 매트릭스는 50^2 블록의 순서로 다소 커질 수 있습니다. 내 초기 추측은 동적으로 뮤텍스의 vector/map을 할당하는 것이다.

좋은 접근 방법입니까? 여러 조건 변수를 대신 사용하는 것이 더 좋습니다. 더 나은 접근법이 있습니까?

감사합니다

+0

항상 프로그램의 동일한 매트릭스에서 작업하고 있습니까? 아니면 (비디오 처리와 같은) 행렬의 시퀀스입니까? –

+0

@Emil 동일한 행렬 – Anycorn

답변

5

단일 잠금 장치를 사용하십시오. 그러나 전체 매트릭스를 보호하기 위해 사용하는 대신 어떤 블록이 "잠겨"있다고 말하는 std::set (또는 boost::unordered_set)을 보호하기 위해 사용하십시오.

이와 비슷한 것.

class Block; 

class Lock_block 
{ 
public: 
    Lock_block(Block& block) : m_block(&block) 
    { 
     boost::unique_lock<boost::mutex> lock(s_mutex); 
     while(s_locked.find(m_block) != s_locked.end()) 
     { 
     s_cond.wait(lock); 
     } 
     bool success = s_locked.insert(m_block).second; 
     assert(success); 
    } 

    ~Lock_block() 
    { 
     boost::lock_guard<boost::mutex> lock(s_mutex); 
     std::size_t removed = s_locked.erase(m_block); 
     assert(removed == 1); 
     s_cond.notify_all(); 
    } 
private: 
    Block* m_block; 

    static boost::mutex s_mutex; 
    static boost::condition s_cond; 
    static std::set<Block*> s_locked; 
}; 
+0

이것은 실제로 더 간단합니다. 감사합니다. – Anycorn

1

그것은 당신이 사용할 수있는 몇 가지 방법이 될 수 있습니다

  1. 잠금으로 크리티컬 섹션/뮤텍스 (2500 많은없는) 경우 배열을 미리 할당하고 사용 블록 인덱스 블록 접근을 수집하기위한 색인; 블록을 업데이트하기 전에 변경하려는 모든 블록을 잠급니다. 업데이트; 터놓다;

  2. 계산 시간이 Lock/Unlock보다 훨씬 길면 스레드 컨텍스트에서 블록의 내용을 복사하고 그 시간 동안 블록 잠금을 유지하십시오. 블록을 업데이트하기 전에 블록을 다시 잠그고 다른 스레드가 업데이트하지 않았는지 확인하십시오 (관련이있는 경우). 다른 스레드가 업데이트 한 경우 작업을 반복하십시오.

  3. 블록 내용의 크기가 작은 경우 원자 데이터 교환을 사용하여 블록 내용을 업데이트하고 잠금은 필요하지 않습니다. 한 블록의 데이터를 사용하여 다른 블록의 데이터를 계산하는 경우, 그렇지 않은 경우에는 필요한 모든 업데이트 된 블록에 걸쳐 잠금을 설정하십시오.

  4. 매트릭스에 대한 읽기 작업이 있습니까? 그렇다면 읽기/쓰기 잠금을 사용하여 성능을 향상시킵니다.

관련 문제