Concurrency semop是否对所有SOP进行原子化检查?

Concurrency semop是否对所有SOP进行原子化检查?,concurrency,locking,Concurrency,Locking,我正在使用semop实现R/W锁,如下所示。 我的问题是:semop是否对所有SOP进行原子化检查?比如,semop先添加一些锁,然后逐个检查这三个SOP 如果没有,是否会发生以下情况? 当一个线程调用CSemRWLock::CWriteLock::lock时,通过检查第一个SOP发现没有读取器,然后转到第二个SOP。同时,另一个调用CReadLock::lock的线程将第一个值更改为非零值。两个线程都获得锁,一个读取,一个写入 如果是这样,CWriteLock::lock需要交换前两个SOP,

我正在使用semop实现R/W锁,如下所示。 我的问题是:semop是否对所有SOP进行原子化检查?比如,semop先添加一些锁,然后逐个检查这三个SOP

如果没有,是否会发生以下情况? 当一个线程调用CSemRWLock::CWriteLock::lock时,通过检查第一个SOP发现没有读取器,然后转到第二个SOP。同时,另一个调用CReadLock::lock的线程将第一个值更改为非零值。两个线程都获得锁,一个读取,一个写入

如果是这样,CWriteLock::lock需要交换前两个SOP,首先指定有writer,然后判断没有读卡器。对吧?

bool CSemRWLock::CWriteLock::lock()
{
    //judge no reader
    sbuf[0].sem_num = 0;
    sbuf[0].sem_op = 0;
    sbuf[0].sem_flg = 0;

    //specify there is writer
    sbuf[1].sem_num = 1;
    sbuf[1].sem_op = 1;
    sbuf[1].sem_flg = SEM_UNDO;

    //occupy the writter resource
    sbuf[2].sem_num = 2;
    sbuf[2].sem_op = -1;
    sbuf[2].sem_flg = SEM_UNDO;

    semop(m_iSemID, sbuf, 3)
    ......
}

bool CSemRWLock::CReadLock::lock()
{
    //add a reader
    sbuf[0].sem_num = 0;
    sbuf[0].sem_op = 1;
    sbuf[0].sem_flg = SEM_UNDO;

    //judge no writer
    sbuf[1].sem_num = 1;
    sbuf[1].sem_op = 0;
    sbuf[1].sem_flg = 0;

    semop(m_iSemID, sbuf, 2);
    ......
}