Повысить сохранность блокировки межпроцессного режима

У меня есть следующий код, который вылетает. Я подозреваю, что это из-за выделения ссылки на стек, что у меня есть эта проблема. Но я хочу избежать затрат на то, чтобы выделять мьютекс и блокировать границы каждый раз

 class Cache {
public:
void createCacheLock(const char* name) {
named_mutex mutex_(open_only, name);
mutex = &mutex_;
scoped_lock<named_mutex> cache_lock_(mutex_, defer_lock);
cache_lock=&cache_lock_ ;

}

void updateCache(const char* name, int newvalue) {
cache_lock->lock()  ;
/* Do update work */
cache_lock->unlock() ;
}

private:
named_mutex* mutex ;
scoped_lock<named_mutex>* cache_lock;}

Затем я существую функцию (cache_lock — это поле класса), и при попытке вызвать cache_lock.lock из другого метода класса моя программа падает (в этом случае updateCache падает в части cache_lock-> lock ())

У меня есть два вопроса: как я могу создать «постоянный» cache_lock, чтобы я мог повторно использовать его без вызова named_mutex (open_only и т. Д.)?
Я хотел бы избегать делать это каждый раз

void updateCache(const char* name, int newvalue) {
named_mutex mutex_(open_only, name);
scoped_lock<named_mutex> cache_lock_(mutex_, defer_lock);
/* Do update work */
cache_lock->unlock() ;

}

Во-вторых, повторить вышеописанную процедуру (а именно найти мьютекс и создать из него блокировку) дорогая операция?

0

Решение

У вас есть указатели на локальные переменные. Локальные переменные существуют в стеке только во время выполнения функции, когда функция возвращает эти объекты уничтоженными и вызванными их деструкторами. Память, занимаемая этими объектами, будет после повторного использования функции использоваться следующей вызываемой функцией. Это означает, что указатели, которые вы имеете, не только указывают на возможно разрушенные объекты, но также могут указывать на использование памяти для чего-то совершенно другого. То же самое касается ссылок, конечно.

Выделите эти объекты в куче с помощью new вместо этого или используйте умные указатели.


Вы можете вызывать конкретные конструкторы объектов в вашем классе в ваших конструкторах список инициализаторов:

class cache
{
public:
cache(const std::string& lock_name)
: mutex_(open_only, lock_name),
cache_lock_(mutex_, defer_lock)
{}

// ...

private:
named_mutex mutex_;
scoped_lock<named_mutex> cache_lock_;

// ...
};
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector