semop以原子方式检查所有sops?

时间:2015-03-24 03:41:55

标签: concurrency locking

我用semop实现R / W锁定如下。 我的问题是:semop以原子方式检查所有sops?就像,semop首先添加一些锁,然后逐个检查这三个。

如果没有,可以发生以下情况吗? 当一个线程调用CSemRWLock :: CWriteLock :: lock()时,通过检查第一个sops发现没有读者,并转到第二个sops。同时,另一个调用CReadLock :: lock()的线程将第一个值更改为非零值。两个线程都获得锁定,一个读取和一个写入。

如果是这样,CWriteLock :: lock()需要交换前两个sops,首先指定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);
    ......
}

0 个答案:

没有答案