C 11解释原子和静音

c++11 interprocess atomics and mutexes

本文关键字:解释      更新时间:2023-10-16

我有一个Linux程序,该程序催生了几个过程(fork),并通过POSIX共享内存进行通信。我想让每个进程分配一个ID(0-255)。我的目的是将BitVector放置在共享内存区域(初始化为零),并在原子上比较并交换一些分配ID。

是否有C 11对此友好的方法?我可以创建一个原子块吗?我可以在过程中使用互斥X吗?我如何确保在所有过程中仅一次又一次地调用构造函数?

c 11螺纹原始词(静音,原子等)是螺纹 iminives。C 标准不参考过程,并且大多数这些工具不会跨进程进行互操作。

标准中唯一的流程是在非规范性符号中,该符号说,无锁原子的目的是适合IPC:

无锁的操作也应无锁定。也就是说,通过两个不同地址在同一内存位置上的原子操作将在原子上进行交流。实施不应取决于任何人为状态。该限制可以通过内存进行通信,该内存将不止一次地映射到一个过程中,并通过两个过程之间共享的内存。

之间。

在此非规范符号之外,螺纹原始词并非打算是实现过程间通信的一种手段。将这些对象的行为放在共享内存中(如上所述,除了无锁的原子)是未定义的。

您可以在共享内存块内使用互斥X,但是必须将静音符号声明为共享,因此使用共享内存内的默特克斯在共享中并不异常简单:

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;
}