Класс QSharedMemory
Класс QSharedMemory предоставляет доступ к сегменту общей памяти. Подробнее...
| Заголовок: | #include <QSharedMemory> |
| CMake: | find_package(Qt6 COMPONENTS Core REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| Наследует: | QObject |
Типы
| Перечисление | AccessMode { ReadOnly, ReadWrite } |
| Перечисление | SharedMemoryError { NoError, PermissionDenied, InvalidSize, KeyError, AlreadyExists, …, UnknownError } |
Открытые функции
| QSharedMemory(const QString &key, QObject *parent = nullptr) | |
| QSharedMemory(QObject *parent = nullptr) | |
| virtual | ~QSharedMemory() |
| bool | attach(QSharedMemory::AccessMode mode = ReadWrite) |
| const void * | constData() const |
| bool | create(qsizetype size, QSharedMemory::AccessMode mode = ReadWrite) |
| void * | data() |
| const void * | data() const |
| bool | detach() |
| QSharedMemory::SharedMemoryError | error() const |
| QString | errorString() const |
| bool | isAttached() const |
| QString | key() const |
| bool | lock() |
| QString | nativeKey() const |
| void | setKey(const QString &key) |
| void | setNativeKey(const QString &key) |
| qsizetype | size() const |
| bool | unlock() |
Подробное описание
QSharedMemory предоставляет доступ к сегменту общей памяти для нескольких потоков и процессов. Также она предоставляет способ для одного потока или процесса заблокировать память для эксклюзивного доступа.
При использовании этого класса следует учитывать следующие платформенные различия:
- Windows: QSharedMemory не «владеет» сегментом общей памяти. Когда все потоки или процессы, имеющие экземпляр QSharedMemory, подключенный к конкретному сегменту общей памяти, либо уничтожили свой экземпляр QSharedMemory, либо завершили работу, ядро Windows автоматически освобождает сегмент общей памяти.
- Unix: QSharedMemory «владеет» сегментом общей памяти. Когда последний поток или процесс, имеющий экземпляр QSharedMemory, подключенный к конкретному сегменту общей памяти, отсоединяется от сегмента, уничтожив свой экземпляр QSharedMemory, ядро Unix освобождает сегмент общей памяти. Но если этот последний поток или процесс аварийно завершает работу без вызова деструктора QSharedMemory, сегмент общей памяти сохраняется после сбоя.
- HP-UX: Допускается только одно подключение к сегменту общей памяти на процесс. Это означает, что QSharedMemory не следует использовать в нескольких потоках в одном процессе на HP-UX.
- Платформы Apple: Приложения с ограниченным доступом (включая приложения, распространяемые через Apple App Store) требуют использования POSIX общей памяти (вместо общей памяти System V), что добавляет ряд ограничений, включая:
- Ключ должен иметь вид
<application group identifier>/<custom identifier>, как описано здесь и здесь. - Длина ключа ограничена 30 символами.
- При завершении процесса именованные сегменты общей памяти не очищаются, поэтому повторный запуск приложения и повторное создание общей памяти с тем же именем приведет к ошибке. Чтобы обойти эту проблему, используйте подключение к существующему сегменту общей памяти:
QSharedMemory shm("DEVTEAMID.app-group/shared"); if (!shm.create(42) && shm.error() == QSharedMemory::AlreadyExists) shm.attach();
- Ключ должен иметь вид
Не забудьте заблокировать общую память с помощью lock() перед чтением или записью в общую память и не забудьте освободить блокировку с помощью unlock() после завершения работы.
QSharedMemory автоматически уничтожает сегмент общей памяти, когда последний экземпляр QSharedMemory отсоединяется от сегмента и ссылки на сегмент больше не остаются.
Предупреждение: QSharedMemory изменяет ключ особым способом Qt, если не указано иное. Взаимодействие с приложениями, не использующими Qt, достигается сначала путем создания стандартной общей памяти с QSharedMemory() и последующего задания нативного ключа с помощью setNativeKey(). При использовании нативных ключей общая память не защищена от множественного доступа к ней (например, не может быть заблокирована()) и для достижения такой защиты следует использовать пользовательский механизм.
Документация по типам членов
Перечисление QSharedMemory::AccessMode
| Константа | Значение | Описание |
|---|---|---|
QSharedMemory::ReadOnly |
0 |
Сегмент общей памяти является только для чтения. Запись в сегмент общей памяти запрещена. Попытка записи в сегмент общей памяти, созданный с ReadOnly, приводит к прерыванию программы. |
QSharedMemory::ReadWrite |
1 |
Чтение и запись в сегмент общей памяти разрешены. |
Перечисление QSharedMemory::SharedMemoryError
| Константа | Значение | Описание |
|---|---|---|
QSharedMemory::NoError |
0 |
Ошибка не произошла. |
QSharedMemory::PermissionDenied |
1 |
Операция завершилась неудачей из-за отсутствия необходимых разрешений у вызывающего потока. |
QSharedMemory::InvalidSize |
2 |
Операция создания завершилась неудачей из-за некорректного указанного размера. |
QSharedMemory::KeyError |
3 |
Операция завершилась неудачей из-за некорректного ключа. |
QSharedMemory::AlreadyExists |
4 |
Операция create() завершилась неудачей, так как сегмент общей памяти с указанным ключом уже существовал. |
QSharedMemory::NotFound |
5 |
Подключение attach() завершилось неудачей, так как сегмент общей памяти с заданным ключом не был найден. |
QSharedMemory::LockError |
6 |
Попытка заблокировать сегмент общей памяти завершилась неудачей, так как операция create() или attach() завершилась неудачей и вернула false, или из-за системной ошибки в QSystemSemaphore::acquire(). |
QSharedMemory::OutOfResources |
7 |
Операция create() завершилась неудачей из-за недостатка памяти для выполнения запроса. |
QSharedMemory::UnknownError |
8 |
Произошла другая ошибка. |
Документация по функциям-членам
QSharedMemory::QSharedMemory(const QString &key, QObject *parent = nullptr)
Создаёт объект общей памяти с заданным parent и ключом, установленным в key. Поскольку ключ установлен, можно вызывать функции create() и attach().
См. также setKey(), create() и attach().
QSharedMemory::QSharedMemory(QObject *parent = nullptr)
Эта функция перегружает QSharedMemory().
Создаёт объект общей памяти с заданным parent. Ключ объекта общей памяти не устанавливается конструктором, поэтому к объекту общей памяти не прикреплён сегмент общей памяти. Ключ необходимо установить с помощью setKey() или setNativeKey() перед тем, как можно будет использовать create() или attach().
См. также setKey().
[virtual] QSharedMemory::~QSharedMemory()
Деструктор очищает ключ, что заставляет объект общей памяти отсоединиться от сегмента общей памяти. Если этот объект общей памяти является последним подключённым к сегменту общей памяти, операция отсоединения уничтожает сегмент общей памяти.
См. также detach() и isAttached().
bool QSharedMemory::attach(QSharedMemory::AccessMode mode = ReadWrite)
Попытка прикрепить процесс к сегменту общей памяти, идентифицируемому ключом, переданным в конструктор или вызову setKey() или setNativeKey(). Режим доступа mode по умолчанию равен ReadWrite. Также может быть ReadOnly. Возвращает true, если операция присоединения выполнена успешно. Если возвращается false, вызовите error(), чтобы определить возникшую ошибку. После присоединения сегмента общей памяти указатель на общую память можно получить, вызвав data().
См. также isAttached(), detach() и create().
const void *QSharedMemory::constData() const
Возвращает указатель const на содержимое сегмента общей памяти, если он присоединён. В противном случае возвращает null. Не забудьте заблокировать общую память с помощью lock() перед чтением или записью в общую память и не забудьте освободить блокировку с помощью unlock() после завершения работы.
См. также attach() и create().
bool QSharedMemory::create(qsizetype size, QSharedMemory::AccessMode mode = ReadWrite)
Создаёт сегмент общей памяти размером size байт с ключом, переданным в конструктор, установленным с помощью setKey() или setNativeKey(), затем присоединяется к новому сегменту общей памяти с заданным режимом доступа mode и возвращает true. Если сегмент общей памяти, идентифицируемый ключом, уже существует, операция присоединения не выполняется и возвращается false. Когда возвращается false, вызовите error(), чтобы определить возникшую ошибку.
См. также error().
void *QSharedMemory::data()
Возвращает указатель на содержимое сегмента общей памяти, если он присоединён. В противном случае возвращает null. Не забудьте заблокировать общую память с помощью lock() перед чтением или записью в общую память и не забудьте освободить блокировку с помощью unlock() после завершения работы.
См. также attach().
const void *QSharedMemory::data() const
Эта функция перегружает data().
bool QSharedMemory::detach()
Отсоединяет процесс от сегмента общей памяти. Если это был последний процесс, подключённый к сегменту общей памяти, то сегмент общей памяти высвобождается системой, т.е. содержимое уничтожается. Функция возвращает true, если она отсоединяет сегмент общей памяти. Если возвращается false, это обычно означает, что сегмент либо не подключён, либо заблокирован другим процессом.
См. также attach() и isAttached().
QSharedMemory::SharedMemoryError QSharedMemory::error() const
Возвращает значение, указывающее, произошла ли ошибка, и, если да, то какая.
См. также errorString().
QString QSharedMemory::errorString() const
Возвращает текстовое описание последней произошедшей ошибки. Если error() возвращает значение ошибки, вызовите эту функцию, чтобы получить текстовую строку, описывающую ошибку.
См. также error().
bool QSharedMemory::isAttached() const
Возвращает true, если этот процесс присоединён к сегменту общей памяти.
См. также attach() и detach().
QString QSharedMemory::key() const
Возвращает ключ, назначенный с помощью setKey() для этой общей памяти или null-ключ, если ключ не был назначен или сегмент использует nativeKey(). Ключ — это идентификатор, используемый приложениями Qt для идентификации сегмента общей памяти.
Вы можете получить системный, специфичный для платформы, ключ, вызвав nativeKey().
См. также setKey() и setNativeKey().
bool QSharedMemory::lock()
Это семафор, который блокирует сегмент общей памяти для доступа этим процессом и возвращает true. Если другой процесс заблокировал сегмент, эта функция блокируется до тех пор, пока блокировка не будет освобождена. Затем она приобретает блокировку и возвращает true. Если эта функция возвращает false, это означает, что вы проигнорировали ложное возвращение из create() или attach(), что вы установили ключ с помощью setNativeKey() или что QSystemSemaphore::acquire() завершилась неудачно из-за неизвестной системной ошибки.
См. также unlock(), data() и QSystemSemaphore::acquire().
QString QSharedMemory::nativeKey() const
Возвращает системный, специфичный для платформы, ключ для этого объекта общей памяти. Системный ключ — это идентификатор, используемый операционной системой для идентификации сегмента общей памяти.
Вы можете использовать системный ключ для доступа к сегментам общей памяти, которые не были созданы Qt, или для предоставления доступа к общей памяти приложениям, не использующим Qt.
См. также setKey() и setNativeKey().
void QSharedMemory::setKey(const QString &key)
Устанавливает независимый от платформы ключ для этого объекта общей памяти. Если key совпадает с текущим ключом, функция возвращается без каких-либо действий.
Вы можете вызвать key(), чтобы получить независимый от платформы ключ. Внутренне, QSharedMemory преобразует этот ключ в системный ключ.
Если объект общей памяти подключён к сегменту общей памяти, он отсоединится от него перед установкой нового ключа. Эта функция не выполняет attach().
См. также key(), nativeKey() и isAttached().
void QSharedMemory::setNativeKey(const QString &key)
Устанавливает системный, специфичный для платформы, ключ для этого объекта общей памяти. Если key совпадает с текущим системным ключом, функция возвращается без каких-либо действий. Если всё, что вам нужно, это назначить ключ сегменту, вы должны вызвать setKey() вместо этого.
Вы можете вызвать nativeKey(), чтобы получить системный ключ. Если системный ключ был назначен, вызов key() вернёт пустую строку.
Если объект общей памяти подключён к сегменту общей памяти, он отсоединится от него перед установкой нового ключа. Эта функция не выполняет attach().
Приложение не будет портативным, если вы установите системный ключ.
См. также nativeKey(), key() и isAttached().
qsizetype QSharedMemory::size() const
Возвращает размер подключенного сегмента общей памяти. Если сегмент общей памяти не подключен, возвращается 0.
Примечание: Размер сегмента может быть больше, чем запрошенный размер, переданный в create().
См. также create() и attach().
bool QSharedMemory::unlock()
Освобождает блокировку сегмента общей памяти и возвращает true, если блокировка в данный момент удерживается этим процессом. Если сегмент не заблокирован или блокировка удерживается другим процессом, ничего не происходит и возвращается false.
См. также lock().
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/qsharedmemory.html