1. 程式人生 > >QSharedMemory共享記憶體

QSharedMemory共享記憶體

QSharedMemory為多執行緒和多程序提供了訪問共享記憶體段的功能。

但使用該類時,在不同的平臺上會有一點差異:

  • Windows:QSharedMemory物件不擁有共享記憶體段。當擁有一個關聯在特定共享記憶體段上的QSharedMemory例項的執行緒或程序,在銷燬它們的QSharedMemory例項時,Windows核心會自動釋放共享記憶體段。
  • Unix:QSharedMemory物件擁有共享記憶體段。當最後一個擁有關聯在特定共享記憶體段的QSharedMemory例項的執行緒或程序,通過銷燬QSharedMemory例項而從共享記憶體段detach時,Unix核心會釋放共享記憶體段。但是,如果最後一個執行緒或程序沒有執行QSharedMemory的解構函式就崩潰了,那麼共享記憶體段會持續存在。
  • HP-UX:在一個程序內,只能有一個執行緒關聯到共享記憶體上,這意味著在該平臺上,QSharedMemory不能在同一個程序的多個執行緒間使用。
還有,當我們在從共享記憶體段中讀取或向其中寫入資料時,應該先使用lock()鎖定該共享記憶體段,並在訪問完成後,使用unlock()來解鎖。 QSharedMemory會在最後一個QSharedMemory例項從共享記憶體段detach()時,自動銷燬共享記憶體段。 下面,我們寫兩個應用程式來使用一下該類。 新建兩個控制檯程式,Shared1和Shared2。其中,Shared1會建立共享記憶體,並向其中寫入一個字串;Shared2則從該共享記憶體段中讀出相應的內容。 Shared1程式碼如下:
#include <QCoreApplication>
#include <QSharedMemory>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QSharedMemory sm("SharedMem");
    if(sm.isAttached())
    {
        sm.detach();//將該程序與共享記憶體段分離
    }
    if(!sm.create(100))
    {
        qDebug() << "Create Shared Memory Failed";
        return 0;
    }
    qDebug() << "share memory size: " << sm.size();

    if(!sm.lock())
    {
        qDebug() << "Can't lock the shared memory";
        return 0;
    }

    const char* str = "hello, shared memory";
    memcpy((char*)sm.data(), str, sm.size());
    if(!sm.unlock())
    {
        qDebug() << "Can't unlock the shared memory";
        return 0;
    }
    qDebug() << "Write to shared memory: " << str;

    return a.exec();
}
Shared2程式碼如下:
#include <QCoreApplication>
#include <QSharedMemory>
#include <QDebug>
#include <QBuffer>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QSharedMemory sm("SharedMem");

    if(!sm.attach())
    {
        qDebug() << "Attach Shared Memory Failed";
        return 0;
    }

    if(!sm.lock())
    {
        qDebug() << "Can't lock the shared memory";
        return 0;
    }

    QBuffer buf;
    buf.open(QIODevice::WriteOnly);
    buf.write((char*)sm.data());
    buf.close();

    if(!sm.unlock())
    {
        qDebug() << "Can't unlock the shared memory";
        return 0;
    }
    qDebug() << "Load from shared memory: " << buf.data();

    return a.exec();
}
同時啟動兩個程式,執行結果如下:



說明,我們從共享記憶體中讀取到了我們寫入的資訊。 並且,還有注意第一幅圖中,我們打印出的共享記憶體的大小。我們在使用create()函式建立共享記憶體時,明明指定的大小是100位元組,但打印出的大小卻是4096位元組,可見QSharedMemory類會將共享記憶體塊的大小舍入到系統記憶體頁面的大小,即4k。

相關推薦

Qt QSharedMemory共享記憶體的使用

可用於程序間通訊。 建立物件:利用QSharedMemory類建立例項物件時,必須為該共享記憶體指定關鍵字(即為該共享記憶體起一個名字)。只有當共享記憶體被設定了關鍵字之後,才可以執行建立create()、關聯attach()等操作。為共享記憶體指定關鍵字有兩種方法: SharedMemor

QSharedMemory 共享記憶體 程序間通訊

QT間程序通訊之共享記憶體 Qt提供了一種安全的共享記憶體的實現QSharedMemory,以便在多執行緒和多程序程式設計中安全的使用。 下面的例子以兩個程序exe共享一塊記憶體為例。 先說下實現共享記憶體的步驟,然後用一具體的例項說明。 向共享記憶體中提供資料的一

QSharedMemory共享記憶體

QSharedMemory為多執行緒和多程序提供了訪問共享記憶體段的功能。 但使用該類時,在不同的平臺上會有一點差異: Windows:QSharedMemory物件不擁有共享記憶體段。當擁有一個關聯在特定共享記憶體段上的QSharedMemory例項的執行緒或程序,在銷

qt 共享記憶體(QSharedMemory)

(本次程式基於控制檯程式) 首先 使用共享記憶體得召喚一下: #include <QSharedMemory> 然後 宣告QSharedMemory類。並且命名為smem QSharedMemory smem; 由於共享記憶體沒有訪問金鑰,則不能找到共享的記憶體。

QT 共享記憶體 QSharedMemory記憶體對映

QSharedMemory 使用本地 Key (即平臺相關,setNativeKey)時,可以和其他非QT應用互動。 例如,Windows平臺下API建立共享記憶體 CreateFileMapping

以佇列的形式使用共享記憶體

共享記憶體允許多個程序使用某一段儲存區,資料不需要在程序之間複製,多個程序都把該記憶體區域對映到自己的虛擬地址空間,直接訪問該共享記憶體區域,從而可以通過該區域進行通訊,是一種速度很快IPC。 下面是共享記憶體對映圖 一般描述使用共享記憶體,都是以普通緩衝區的形式訪問,這裡

windows 驅動開發 MDL 核心層 使用者層共享記憶體

參考資料    https://blog.csdn.net/wdykanq/article/details/7752909    http://blog.51cto.com/laokaddk/404584   核心層建立記憶體對映使用者層 PVOID

ython實現程序間的通訊有Queue,Pipe,Value+Array等,其中Queue實現多個程序間的通訊,而Pipe實現兩個程序間通訊,而Value+Array使用得是共享記憶體對映檔案的方式,所以速度比較快

1.Queue的使用 from multiprocessing import Queue,Process import os,time,random #新增資料函式 def proc_write(queue,urls): print("程序(%s)正在寫入..."%(os.getpid()))

Linux-程序通訊-訊息佇列/訊號燈/共享記憶體

訊息佇列     訊息佇列提供了程序間傳送資料塊的方法,每個資料塊都可以被認為是有一個型別,接受者接受的資料塊可以有不同的型別;我們可以通過傳送訊息來避免命名管道的同步和阻塞問題;訊息佇列與命名管道一樣,每個資料塊都有一個最大長度的限制;我們可以將每個資料塊當作是一

風河虛擬化元件使用說明(15)—— 為Windows系統安裝VNIC驅動及共享記憶體驅動(on target)

參考Guest Guide文件"Windows VNIC Driver Overview"和"Windows Shared Memory Driver Overview" 首先將Windows 10作為GuestOS啟動:  進入WindShare網站(http://wind

c/c++ linux 程序間通訊系列4,使用共享記憶體

linux 程序間通訊系列4,使用共享記憶體 1,建立共享記憶體,用到的函式shmget, shmat, shmdt 函式名 功能描述 shmget 建立共享記憶體,返回pic key

檔案記憶體對映mmap解決大檔案快速讀寫問題和程序間共享記憶體

mmap函式主要用途有三個: 1、將一個普通檔案對映到記憶體中,通常在需要對檔案進行頻繁讀寫時使用,這樣用記憶體讀寫取代I/O讀寫,以獲得較高的效能; 2、將特殊檔案進行匿名記憶體對映,可以為關聯程序提供共享記憶體空間; 3、為無關聯的程序提供共享記憶體空間,一般也是將一個普通檔案對映到

CUDA程式設計(七)共享記憶體與Thread的同步

https://blog.csdn.net/sunmc1204953974/article/details/51078818   CUDA程式設計(七) 共享記憶體與Thread的同步 在之前我們通過block,繼續增大了執行緒的數量,結果還是比較令人滿意的,但是也產生了一

CUDA 共享記憶體 bank conflict

1. bank conflict 本文所有的實驗針對 GTX980 顯示卡,Maxwell 架構,計算能力 5.2。 GPU 共享記憶體是基於儲存體切換的架構(bank-switched-architecture)。在 Femi,Kepler,Maxwell 架構的裝置上有 3

程序間通訊(三)共享記憶體

概念: 共享記憶體區是最快的IPC形式。⼀一旦這樣的記憶體對映到共享它的程序的地址空間,這些程序間資料傳遞不再 涉及到核心,換句話說是程序不再通過執⾏行進⼊入核心的系統調⽤用來傳遞彼此的資料。 共享記憶體中的函式: shmget函式: 功能:⽤用來建立共享記憶體 原型

Linux:程序間通訊(匿名管道命名管道)(共享記憶體,訊息佇列,訊號量)

目錄 程序間通訊的介紹 管道 匿名管道 原理: 程式碼實現 匿名管道特性 實現管道符 |  命名管道 命名管道特性 程式碼實現 管道讀寫規則 作業系統中ipc的相關命令 共享記憶體(重點) 生命週期: 程式碼實現 程式碼實現獲

作業系統(11)程序--程序通訊:訊號、管道、訊息佇列、共享記憶體

文章目錄 1. 程序通訊相關概念 1. 通訊流程、屬性、鏈路 2. 程序通訊方式:直接通訊、間接通訊 2. 程序通訊的機制 1. 訊號 2. 管道 3. 訊息佇列

ORA-04031 無法分配 12519000 位元組的共享記憶體 large pool , unknown obje

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C++:通過C++程式碼簡單理解程序間的通訊機制:共享記憶體

下面用共享對映檔案的方式實現程序間通訊,程式碼可以執行。 一、淺理解 每個程序有自己獨立的空間,一個程序無法訪問其他程序的資料。就好像兩個是互不干涉的個體,想讓它們進行通訊(交換資料),就必須有一段它們都可以訪問到的空間,作為中間介質。在計算機中,可以存放資料的地方分為記憶體和硬

共享記憶體及其用mmap實現共享記憶體

一、什麼是共享記憶體 顧名思義,共享記憶體就是允許兩個不相關的程序訪問同一個邏輯記憶體。共享記憶體是在兩個正在執行的程序之間共享和傳遞資料的一種非常有效的方式。不同程序之間共享的記憶體通常安排為同一段實體記憶體。程序可以將同一段共享記憶體連線到它們自己的地址空間中,所有程序都可以訪問共享記