2011-07-02

複数のmutexが欲しい状況

複数のmutexが必要な状況を考えてみた。

// 排他的にアクセスするリソース
class exclusive_resource
{
public :
    std::vector<int> v ;
private :
    std::mutex m ;
public :
    void lock() { m.lock() ; }
    void try_lock() { m.try_lock() ; }
    void unlock() { m.unlock() ; }
} ;

exclusive_resource res1, res2 ;

void thread1()
{// res1のみを操作
    std::lock_guard< exclusive_resource > guard( res1 ) ;
    res1.v.push_back(0) ;
}

void thread2()
{// res2のみを操作
    std::lock_guard< exclusive_resource > guard( res2 ) ;
    res2.v.push_back(0) ;
}

void thread3()
{// res1, res2両方を操作
    std::lock( res1, res2 ) ; // デッドロックを回避するためstd::lockを使用すること
    // res1, res2両方を操作、実際には途中のreturnや例外に気をつけること
    res1.unlock() ; res2.unlock() ;
}

void thread4()
{// thread3と同じく、res1, res2の両方を操作、thread3とは異なる処理
    std::lock( res1, res2 ) ; // デッドロックを回避するためstd::lockを使用すること
    // res1, res2両方を操作、実際には途中のreturnや例外に気をつけること
    res1.unlock() ; res2.unlock() ;
}

今、異なるスレッド間で操作したいオブジェクトが複数あるとする。しかし、常に全オブジェクトを操作する必要はないものとする。とすれば、この複数のオブジェクトを、単一のmutexで排他的にアクセスするのは、非効率的である。したがって、アクセスしたい単位ごとに、別々のmutexを用意するのは当然である。

しかしまた、ある状況では、複数の単位に、同時にアクセスしたい場合もあるとする。この場合、複数のmutexをlockしなければならない。しかし、普通に一つづつlockしたのでは、デッドロックに陥る可能性がある。このため、デッドロックを避けるように気をつけつつロックしなければならない。

std::lockは、lock(), try_lock(), unlock()を組み合わせた一連の呼び出しにより、デッドロックに陥らない方法で、すべてのLockable要求を満たす型のオブジェクトをロックしてくれる。

まとめとしては、複数のmutexを同時にlockする際には、デッドロックを避けるために、std::lockを使うべきである。

34 comments:

motivation456 said...

Very Niceonline tutoring sites for computer science

motivation456 said...

Very Niceengineering tutor online

motivation456 said...

Very Nicebe an online english tutor

deepak said...

very nice paid online tutoring

motivation456 said...

Very Nicedungeon fighter online best class

deepak said...

Very Niceonline tutor for mechanical engineering

deepak said...

Very Nicetissnet online coaching

deepak said...

Very Nicebest machine learning course coursera

motivation456 said...

Very Nicestanford free machine learning course

deepak said...

Very Nicebasic accounting course

deepak said...

Very Nicewarhammer online age of reckoning classes

durga said...

Very Niceonline tally course

deepak said...

Very Niceprinciples of accounting 1 online course

bhanu said...

Very Nicefree online coaching for ugc net in hindi

bhanu said...

Very Nicedatabase administrator courses online free

bhanu said...

Very Niceoracle dba course online

deepak said...

Very Nicecabal force blader

bhanu said...

Very Nicehuman biology course online

bhanu said...

Very Nicejava online classes

bhanu said...

Very Nicefinancial accounting online course harvard

deepak said...

Very Nicebasic maths courses for adults

bhanu said...

Very Niceandroid development course free online

bhanu said...

Very Niceandroid development course free online

bhanu said...

Very Niceblack desert ps4 launch classes

deepak said...

Very Niceugc net online coaching commerce

bhanu said...

Very Niceudacity free courses web development

deepak said...

Very Niceedx ap chemistry

deepak said...

Very Nicelatale new class

deepak said...

Very Nicesword art online integral factor classes

deepak said...

Very Niceneverwinter online druid

bhanu said...

Very Nicemicrosoft access classes online

deepak said...

Very Niceml courses online

deepak said...

Very Niceonline chemistry courses community college

bhanu said...

Very Niceugc net online coaching