My problem is, I have block matrix updated by multiple threads. Multiple threads may be updating disjoint block at a time but in general there may be race conditions. right
Use a single lock. But instead of using it to protect the entire matrix use it to guard a std::set (or a boost::unordered_set) which says which blocks are "locked".
Something like this.
class Block;
class Lock_block
{
public:
Lock_block( Block& block ) : m_block(&block)
{
boost::unique_lock 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 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 s_locked;
};