Я работаю на сервере, используя watchdir для добавления элементов во внутреннюю коллекцию. Watchdir периодически просматривается потоком, который создается следующим образом:
this->watchDirThread = new boost::thread(boost::bind(&Filesystem::watchDirThreadLoop,
this,
this->watchDir,
fileFoundCallback));
fileFoundCallback
параметр также создается через boost::bind
:
boost::bind(&Collection::addFile, this->collection, _1)
Я хотел бы защитить свою коллекцию от одновременного доступа с использованием мьютекса, но моя проблема в том, что boost::mutex
класс не копируемый, поэтому в моем не может быть мьютекса Collection
класс с boost::bind
требует копируемых параметров.
Мне не нравится идея статического мьютекса, потому что это было бы семантически неправильно, поскольку роль мьютекса в этом случае состоит в том, чтобы не допустить чтения моей коллекции во время ее модификации.
Что я могу сделать, чтобы решить эту проблему?
использование std :: ref или std :: cref вокруг мьютекса. То есть вместо:
boost::mutex yourmutex;
boost::bind(..., yourmutex, ...);
записывать:
boost::mutex yourmutex;
boost::bind(..., std::ref(yourmutex), ...);
Других решений пока нет …