c ++ 11进程间原子和互斥

dsc*_*atz 19 c++ c++11

我有一个Linux程序,它产生几个进程(fork)并通过POSIX共享内存进行通信.我想让每个进程分配一个id(0-255).我的目的是将一个位向量放在共享内存区域(初始化为零)并进行原子比较并交换一点来分配一个id.

是否有一个c ++ 11友好的方式来做到这一点?我可以创建一个原子位集吗?我可以跨进程使用互斥吗?我如何确保在所有进程中只调用一次构造函数?

Nic*_*las 17

C++ 11线程基元(互斥体,原子等)是线程基元.他们对流程一无所知,也不是实现流程间沟通的手段.

由于C++ 11标准没有提及进程或进程间通信,这些原语放置在进程共享内存(内存映射文件,某种进程外全局映射内存等)时的行为)未定义.

  • [atomics.lockfree]包括"[注意:无锁操作也应该是无地址的.也就是说,通过两个不同地址在同一内存位置上的原子操作将以原子方式进行通信.实现不应依赖于任何进程状态.此限制允许通过多次映射到进程的内存和两个进程之间共享的内存进行通信. - 结束注释]" (10认同)
  • 而且,需要明确的是,该标准的意图显然是原子应该可用于 IPC。杰弗里对标准的引用表明这是真的。也就是说,我不知道这是否已包含在 C++11 的标准中。 (2认同)

小智 6

你可以在共​​享内存块中使用互斥锁,但互斥锁必须声明为SHARED,因此在共享内存中使用互斥锁并不常见,你可以自己创建类,这很简单:

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 这真的需要一个“虚拟”析构函数吗?另外,可能最好使用“pthread_mutex_t *handle”,而不是每次使用它时都进行强制转换。 (2认同)