我想用这个结构来控制共享内存进程间同步。
struct shmLock {
std::atomic_uint32_t user_count;
pthread_mutex_t mutex;
};
如果有人使用
shmLock
,当user_count == 0
时,我会初始化mutex
,然后我使用CAS来增加user_count
。shmLock
,我会用CAS来减少user_count
。当user_count
减少到0时,我会销毁mutex
。class myLock {
public:
myLock(shmLock* lock) : m_lock(lock) {
uint32_t user_count = m_lock->user_count.load();
if (user_count == 0) {
pthread_mutexattr_t mutex_attr{};
pthread_mutexattr_init(&mutex_attr);
pthread_mutexattr_setpshared(&mutex_attr, PTHREAD_PROCESS_SHARED);
pthread_mutex_init(&m_lock->mutex, &mutex_attr);
}
m_lock->user_count.compare_exchange_strong(user_count, user_count + 1);
pthread_mutex_lock(&m_lock->mutex);
}
~myLock() {
pthread_mutex_unlock(&m_lock->mutex);
uint32_t user_count = m_lock->user_count.load();
m_lock->user_count.compare_exchange_strong(user_count, user_count - 1);
if (user_count == 0) {
pthread_mutex_destroy(&m_lock->mutex);
}
}
private:
shmLock* m_lock;
};
我有三个问题。
user_count
来控制mutex
的init和destroy,直接每次在构造函数中init,在析构函数中destroy。compare_exchange_strong
失败了,我该怎么办。首先,你的代码中存在多个同步问题。例如,在
myLock
的构造函数中,您将获取用户计数并在 if 语句中检查它。如果安排了另一个流程并在检查后增加或减少了该值怎么办?此外,当您谈论互斥时,您需要考虑获取-释放内存顺序。如果您需要根据用户计数采取行动,请查看 std::shared_ptr 内部的使用计数用法。更具体地说,看一下它的构造函数和析构函数的源代码。
大多数原始线程同步结构与 IPC 不兼容,但您可以参考 IPC 原子 了解有关 IPC 原子的更多信息。