Const функции не являются поточно-ориентированными. Обычно вы можете вызывать методы объекта const из разных потоков одновременно, но если вы вызываете не const и метод const из разных потоков, вы получаете условие гонки. Проверьте это:
class Foo
{
size_t size_;
public:
...
size_t get_size() const
{
return size_
}
};
class Bar
{
boost::shared_ptr<Foo> foo_;
public:
//accessor
size_t get_size() const
{
size_t size = 0;
if (foo_)
size = foo_->size();
return size;
}
//modifiers
void init()
{
foo_ = new Foo;
}
void clear()
{
foo_ = boost::shared_ptr<Foo>();
}
};
Если кто-то вызовет метод init, а затем вызовет методы clear и get_size одновременно, это приведет к нарушению доступа. Вы должны использовать идиому блокировки чтения-записи. Несколько методов доступа могут быть вызваны одновременно, и только один модификатор может быть вызван одновременно.
Exemple:
class Bar
{
boost::shared_ptr<Foo> foo_;
mutable tbb::spin_rw_mutex lock_;
public:
//accessor
size_t get_size() const
{
size_t size = 0;
//lock modifiers
rw_mutex_type::scoped_lock lock(mutex, false);
if (foo_)
size = foo_->size();
return size;
}
//modifiers
void init()
{
//lock accessor and modifiers
rw_mutex_type::scoped_lock lock(mutex, true);
foo_ = new Foo;
}
void clear()
{
//lock accessor and modifiers
rw_mutex_type::scoped_lock lock(mutex, true);
foo_ = boost::shared_ptr<Foo>();
}
};
tbb :: spin_rw_lock - это класс мьютекса из библиотеки потоков сборки потоков