2012-10-31 28 views
14

私はいくつかのプロセス(fork)を生成し、POSIX共有メモリを通して通信するLinuxプログラムを持っています。私は、各プロセスにid(0-255)を割り当てるようにしたいと思います。私の意図は、共有メモリ領域(ゼロに初期化)にビットベクトルを配置し、アトミックにIDを割り当てるビットを比較してスワップすることです。C++ 11プロセス間アトミックとmutex

これを行うには、C++には11フレンドリな方法がありますか?アトミックビットセットを作成できますか?プロセス間でmutexを使用できますか?コンストラクタがすべてのプロセスで一度だけ呼び出されるようにするにはどうすればよいですか?

+0

forkは、親プロセスにpidの子プロセスを返します。もう1つを生成するのではなく、そのプロセスを使用するのはなぜですか?または私はあなたの質問を誤解しています –

+0

@aleguna 0-255の範囲の値が好きで、プロセスがこのプログラムを離れるときには、それを解放して再利用する必要があります。 – dschatz

+0

@dschatz: "*私は0-255の範囲の値を望むので、"それはなぜ*あなたがそれを必要としているか説明していません。特に、PID機構が非常に優れていれば*より良い*。 –

答えて

11

C++ 11スレッドプリミティブ(mutexes、atomicsなど)は、スレッドプリミティブです。プロセスには何も知らず、プロセス間通信を実現する手段でもありません。

C++ 11標準では、プロセスやプロセス間通信については何も言及していないため、プロセス共有メモリ(メモリマップファイル、グローバルなアウトオブプロセスマップされたメモリなど)は定義されていません。あなたは、共有メモリブロックの内側にミューテックスを使用することができますが、ミューテックスは、したがって、共有メモリの内部ミューテックスを使用しては珍しいことではありません、SHAREDとして宣言する必要があり

+8

[atomics.lockfree]には "[注:ロックフリーの操作はアドレスフリーでなければなりません。つまり、2つの異なるアドレスを介して同じメモリ位置のアトミック操作がアトミックに通信します。この制限は、プロセスに2回以上割り当てられたメモリと、2つのプロセス間で共有されるメモリによる通信を可能にします。 - –

+0

@Nicol Bolas、あなたの答えは素晴らしいですが、どこにも見つかりません私はまだ共有メモリにC++ 11ミューテックスを使用することについていくつか混乱しています。(私が知っているように、PTHREAD_PROCESS_SHAREDを使用している場合、pthread mutexは正常です) –

4

、uは自分のクラスを作ることができ、それは非常に簡単です:

class Mutex { 
private: 
    void *_handle; 
public: 
    Mutex(void *shmMemMutex, bool recursive =false,); 
    virtual ~Mutex(); 

    void lock(); 
    void unlock(); 
    bool tryLock(); 
}; 

Mutex::Mutex(void *shmMemMutex, bool recursive) 
{ 
    _handle = shmMemMutex; 
    pthread_mutexattr_t attr; 
    ::pthread_mutexattr_init(&attr); 
    ::pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED); 
    ::pthread_mutexattr_settype(&attr, recursive ? PTHREAD_MUTEX_RECURSIVE_NP : PTHREAD_MUTEX_FAST_NP); 

    if (::pthread_mutex_init((pthread_mutex_t*)_handle, &attr) == -1) { 
     ::free(_handle); 
     throw ThreadException("Unable to create mutex"); 
    } 
} 
Mutex::~Mutex() 
{ 
    ::pthread_mutex_destroy((pthread_mutex_t*)_handle); 
} 
void Mutex::lock() 
{ 
    if (::pthread_mutex_lock((pthread_mutex_t*)_handle) != 0) { 
     throw ThreadException("Unable to lock mutex"); 
    } 
} 
void Mutex::unlock() 
{ 
    if (::pthread_mutex_unlock((pthread_mutex_t*)_handle) != 0) { 
     throw ThreadException("Unable to unlock mutex"); 
    } 
} 
bool Mutex::tryLock() 
{ 
    int tryResult = ::pthread_mutex_trylock((pthread_mutex_t*)_handle); 
    if (tryResult != 0) { 
     if (EBUSY == tryResult) return false; 
     throw ThreadException("Unable to lock mutex"); 
    } 
    return true; 
} 
関連する問題