使用队列代替自旋

struct lock_t

{

    int flag;

    int guid;

    queue_t * q;

};

struct lock_init(lock_t * m)

{

    m->flag = 0;

    m->guid = 0;

    queue_init(m->q);

};

void lock(lock_t * m)

{

    while(TestAndSet(m->guid, 1) == 1)

        ;


    if(m->flag == 0)

    {

        m->flag = 1;

        m->guid = 0;

    }

    else

    {

        queue_add(m->q, gettid());

        m->guid = 0;

        Park();

    }

}

void unlock(lock_t * m)

{

    while(TestAndSet(m->guid, 1) == 1)

        ;

    if(queue_empty(m->q))

    {

        m->flag = 0;

    }

    else

    {

        unpark(queue_remove(m->q));

    }

    m->guid = 0;

}

你可能感兴趣的:(使用队列代替自旋)