ブログの説明
パソコンやアンドロイドなどの情報を収集しまとめているブログです。

記事内に張られている画像はクリックすると見やすいサイズの画像が表示されるようになっています。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。
アクセスカウンター
検索フォーム
カレンダー
10 | 2017/11 | 12
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

boostライブラリを使った共有メモリサンプル(C++)

共有メモリを使う方法はいくつもあるとおもいますが、Boostライブラリを使った共有メモリのサンプルを作ってみました。
このサンプルはSSharedSt構造体を丸ごと共有します。
また、構造体の出し入れにプロセス間で衝突が起こらないよう、専用の関数を用意してあります。
initSharedMemry関数の引数は最初に起動するプロセスだけtrueにし、他のプロセスはfalseにしておいてください(起動する順番に制限があります。書きかえれば制限をなくせるかも)。

まずクラスのヘッダーファイルです。
ここでは名前はSharedMemory.hにしてあります。

#include<iostream>

//共有メモリ用ヘッダ
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/sync/interprocess_mutex.hpp>
#include <boost/interprocess/containers/vector.hpp>
#include <boost/interprocess/allocators/allocator.hpp>
#include <boost/interprocess/sync/scoped_lock.hpp>

//ミューテックス関係
#include <boost/interprocess/sync/interprocess_mutex.hpp>
#include <boost/interprocess/sync/scoped_lock.hpp>

using namespace std;
using namespace boost::interprocess;


class CSharedMemory
{
     struct SSharedSt
     {
            int value;
            double valueFloat;
     };


     //共有メモリ用変数
     managed_shared_memory *m_shm;

     //共有メモリ空間の名前
     char m_sharedMemoryName[32];

public:
     SSharedSt m_SharedSt; //共有する構造体

     //引数は共有メモリ名
     CSharedMemory( char *sharedMemoryName);
     ~CSharedMemory();
     bool initSharedMemry( bool deleteFlag); //共有メモリを初期化する
     bool setStruct(); //共有メモリにローカルメモリの内容をセットする
     bool getStruct(); //共有メモリからローカルメモリの内容を取得する
};

これがクラスの中身です。
SharedMemory.cppという名前にしてあります。
#include "SharedMemory.h"

CSharedMemory:: CSharedMemory( char *sharedMemoryName)
{
     strcpy( m_sharedMemoryName , sharedMemoryName );
     m_shm = NULL;
}
CSharedMemory::~CSharedMemory()
{
     if( m_shm != NULL )
            delete m_shm;
}
//共有メモリを初期化する
//引数は共有メモリがすでに作られてた時削除するかどうかのフラグ
bool CSharedMemory::initSharedMemry(bool deleteFlag)
{
     int size; //メモリのサイズ
     size = sizeof( SSharedSt ) + 1024*10; //少し多めに確保しておく
     cout << size << "Byte"<< endl;

    if( deleteFlag )shared_memory_object::remove( m_sharedMemoryName );//削除フラグがtrueだったら削除
    m_shm = new managed_shared_memory (open_or_create, m_sharedMemoryName, size);

     
     return true;
}
//共有メモリにローカルメモリの内容をセットする
bool CSharedMemory::setStruct()
{
     //未初期化だったらエラー
     if( m_shm == NULL )
            return false;
 
    // 共有メモリ内に変数を作る(なければ作る)
     interprocess_mutex* mx             = m_shm->find_or_construct<interprocess_mutex>("TheMutex" )();//同期用ミューテックス
     SSharedSt*    SharedMemoryPointer  = m_shm->find_or_construct<SSharedSt>("SSharedSt" )();//メインデータ

     // プロセス間ロック
     scoped_lock<interprocess_mutex> *lock = new scoped_lock<interprocess_mutex>(*mx);

     //内容の変更
    memcpy( SharedMemoryPointer , &m_SharedSt, sizeof( SSharedSt ));//アップロードする

     delete lock; //プロセス間ロック終了
     return true;

}
//共有メモリからローカルメモリの内容を取得する
bool CSharedMemory::getStruct()
{
     if( m_shm == NULL ) //未初期化だったらエラー
            return false;

    // 共有メモリ内のvectorを取得
     interprocess_mutex* mx = m_shm->find_or_construct<interprocess_mutex>("TheMutex" )();//同期用ミューテックス
     SSharedSt*    SharedMemoryPointer  = m_shm->find_or_construct<SSharedSt>("SSharedSt" )();//メインデータ

     // プロセス間ロック
     scoped_lock<interprocess_mutex> *lock = new scoped_lock<interprocess_mutex>(*mx);
 
    memcpy( &m_SharedSt , SharedMemoryPointer ,  sizeof( SSharedSt ));//ダウンロードする

     
     //プロセス間ロック終了
     delete lock;

     return true;
}

最後にmain.cppです。
#include <iostream>
#include <Windows.h>
#include "SharedMemory.h"
using namespace std;

int main()
{
     bool uploadFlag = false; //trueの場合はアップロードする
     CSharedMemory *sm;
     sm = new CSharedMemory( "CSharedMemory");
     int i = 0;
     float f = 0.0;
     if( uploadFlag ) //アップロード側
     {
           sm->initSharedMemry( true );
            while( true )
           {
                sm->m_SharedSt.valueFloat = f;
                sm->m_SharedSt.value = i;
                 if( !sm->setStruct()) cout << "アップロード失敗" << endl;

                cout << sm->m_SharedSt.value << "    " << sm->m_SharedSt.valueFloat << endl;
                i += 1;
                f += 1.1111111;
                Sleep( 1000 );
           }

     }
     else
     {
           sm->initSharedMemry( false );
            while( true )
           {
                 if( !sm->getStruct()) cout << "ダウンロード失敗" << endl;

                cout << sm->m_SharedSt.value << "    " << sm->m_SharedSt.valueFloat << endl;
                Sleep( 1000 );
           }
     }

     delete sm;
     return 0;
}

COMMENT

EDIT COMMENT

非公開コメント

最新トラックバック
ブロとも申請フォーム
QLOOKアクセス解析
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。