boost :: shared_ptr boost :: mutex и конструктор копирования - PullRequest
3 голосов
/ 28 февраля 2012

Мне нужно защитить доступ к структуре данных в моем классе.Поскольку у меня не может быть мьютекса (потому что я не могу его скопировать), я думаю, что у меня есть shared_ptr и я оставлю там мьютекс.Вот пример кода моей идеи:

class Sample {
    typedef boost::lock_guard<boost::mutex> AcquireLock;
    boost::shared_ptr<boost::mutex> mutt;

public:
    Sample() : mutt(new boost::mutex) {}

    void Method()
    {
        AcquireLock lock(*mutt);

        //do some work here
    }
};

У меня есть следующие вопросы:

  • Это плохая практика использовать мьютекс таким образом (как членкласс, через shared_ptr)?
  • Должен ли я иметь конструктор копирования для этого класса, так как у него есть память, выделенная в куче через shared_ptr?

РЕДАКТИРОВАТЬ: Может быть, мне нужно дать немногоподробнее: я создам этот объект только один раз и сохраню его в std :: vector.Мне не нужно делать его копии, и если вектор должен делать копии, я не хочу иметь разные мьютексы для каждой копии.Вот почему я думаю, что конструктор копирования будет работать для меня.

Ответы [ 2 ]

2 голосов
/ 28 февраля 2012

Этот подход является вполне допустимым и законным, но учтите, что по мере развития вашего класса вы можете захотеть применить ту же технику к еще нескольким ученикам. Вот почему я бы порекомендовал вам воспользоваться преимуществом идиомы pImpl:

// in hpp:
class Sample
{
  Impl();
private:
  struct Impl;
  // compiler generated copy-constructor will copy only this shared_ptr
  shared_ptr<void> pImpl_;
};

// in cpp:
struct Sample::Impl
{
  mutex mut_;
  // put here whatever members you need, extend Impl without affecting the Sample interface
};

Impl::Impl() : pImpl_(new Impl)
{}
1 голос
/ 28 февраля 2012

Если вы сделаете копию объекта Sample, будет вызван конструктор копирования, либо сгенерированный автоматически компилятором, либо созданный вами явно.

Является ли хорошей идеей разрешить копированиеПример объектов зависит от того, что вы пытаетесь сделать.Если нет смысла разрешать копии, то сделайте объект не подлежащим копированию, например, предоставив закрытый прототип для конструктора копирования.

Если вы хотите разрешить копии, то вам нужно решить,каждая копия должна иметь свой собственный мьютекс и соответственно определять конструктор копии.Автоматически сгенерированный конструктор копирования будет делать только поверхностную копию, поэтому все копии будут использовать мьютекс.

...