У меня экземпляры одного класса относяться к разным потокам и синхронизируются с помощью сигналов. для доступа к общим данным использую boost::interprocess::upgradeable_mutex. сделал такие объявления
typedef boost::interprocess::interprocess_upgradable_mutex mutex_type;
typedef boost::interprocess::scoped_lock<mutex_type> scoped_lock;
typedef boost::interprocess::sharable_lock<mutex_type> sharable_lock;
typedef boost::interprocess::upgradable_lock<mutex_type> upgradeable_lock;
обычно это по такой схеме делается (не про буст речь, а вообще)
mutex.lock()
читаем
пишем
сигналим
mutex.unlock()
mutex.lock()
быстро читаем
mutex.unlock()
долго анализируем
mutex.lock()
быстро читаем, удостоверяемся, что данные ещё актуальны
пишем
сигналим
mutex.unlock()
заметь, что interprocess - это не работа между потоками, это работа между процессами. это общая память между приложениями, в которой создаются мьютексы, буферы памяти для обмена и прочие общие объекты. а для синхронизации потоков внутри процесса используются обычные мьютексы boost::thread::mutex.
с областями видимости ("создали переменную - заблокировано") работают scoped мьютексы.
на практике это выглядит так:
#include <boost/thread.hpp>
using namespace boost;
// где-то снаружи обоих потоков объявлен мьютекс
mutex some_mutex;
...
{
// некая область видимости
...
// здесь мьютекс не объявлен и не залочен
...
mutex::scoped_lock lock(some_mutex);
// здесь мьютекс залочен
}
// здесь (снаружи области видимости) мьютекс сброшен
mutex.lock()
читаем
пишем
сигналим
mutex.unlock()
interprocess - это межпроцессное взаимодействие. внутри одного приложения его применять можно, но совершенно бессмысленно. разве что для передачи каких-то статических данных между запусками приложения, и то с натяжкой. дело в том, что interprocess сохраняет состояние: то есть, в файловой системе (глобально) создаются файлы, которые затем используются всеми процессами одного пользователя. он задействует очень много ресурсов и не так быстр, как работа внутри одного процесса.
вообще, у буста есть принципы, по которым строится работа средств синхронизации - concepts. они описаны в документации. а сами мьютексы, как объекты, которыми оперируют локи, определены в разных библиотеках и работают в разных пространствах памяти, в зависимости от библиотеки.
принципы для мьютексов описаны здесь: http://www.boost.org/doc/libs/1_53_0/doc/html/thread/synchronization.html#thread.synchronization.mutex_concepts. есть разные мьютексы и разный подход к залочиванию данных. далее, выбор делается из того, что тебе нужно.
Отлично, сделал, спасибо ( после RTFM )
короче сейчас так.
void some_fnc(const int& par) {
// проверки всякие
upgrade_lock lock(mutex);
// тут поиск и приготовления
{
upgrade_to_unique_lock slock(lock);
// тут запись
} // здесь блокировака становиться снова upgradeable
foo_sign(par); // то есть подпищики могут читать..
} // и тут разумеется разблокируется :)
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)