共享内存的进程间同步如何使用CAS或pthread?

问题描述 投票:0回答:1

我想用这个结构来控制共享内存进程间同步。

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

我有三个问题。

  1. 我可不可以不用
    user_count
    来控制
    mutex
    的init和destroy,直接每次在构造函数中init,在析构函数中destroy。
  2. 如果
    compare_exchange_strong
    失败了,我该怎么办。
  3. 我觉得这个方法不好。有没有其他更好的方法来控制共享内存的进程间同步
c++ c pthreads ipc shared-memory
1个回答
0
投票

首先,你的代码中存在多个同步问题。例如,在

myLock
的构造函数中,您将获取用户计数并在 if 语句中检查它。如果安排了另一个流程并在检查后增加或减少了该值怎么办?此外,当您谈论互斥时,您需要考虑获取-释放内存顺序。如果您需要根据用户计数采取行动,请查看 std::shared_ptr 内部的使用计数用法。更具体地说,看一下它的构造函数和析构函数的源代码。

大多数原始线程同步结构与 IPC 不兼容,但您可以参考 IPC 原子 了解有关 IPC 原子的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.