Advanced Programming in UNIX Environment Episode 55

The Single UNIX Specification also defines conditional versions of the reader–writer locking primitives.

#include <pthread.h>

int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
#include <stdlib.h>
#include <pthread.h>

struct job
{
    struct job *j_next;
    struct job *j_prev;
    pthread_t j_id;
};

struct queue
{
    struct job *q_head;
    struct job *q_tail;
    pthread_rwlock_t q_lock;
};

int queue_init(struct queue *qp)
{
    int err;

    qp->q_head=NULL;
    qp->q_tail=NULL;
    err=pthread_rwlock_init(&qp->q_lock,NULL);
    if(err!=0)
        return err;
    return 0;
}

void job_insert(struct queue *qp, struct job *jp)
{
    pthread_rwlock_wrlock(&qp->q_lock);
    jp->j_next=qp->q_head;
    jp->j-prev=NULL;
    if(qp->q_head!=NULL)
        qp->q_head->j_prev=jp;
    else
        qp->tail=jp;
    qp->q_head=jp;
    pthread_rwlock_unlock(&qp->q_lock);
}

void job_append(struct queue *qp, struct job *jp)
{
    pthread_rwlock_wrlock(&qp->q_lock);
    jp->j_next=NULL;

    jp->j_prev=qp->q_tail;
    if(qp->q_tail!=NULL)
        qp->q_tail->j_next=jp;
    else
        qp->q_head=jp;
    qp->q_tail=jp;
    pthread_rwlock_unlock(&qp->q_lock);
}

void job_remove(struct queue *qp, struct job *jp)
{
    pthread_rwlock_wrlock(&qp->q_lock);
    if(jp==pq->q_head)
    {
        qp->q_head=jp->j_next;
        if(qp->q_tail==jp)
            qp->tail=NULL;
        else
            jp->j_next->j_prev=jp->j_prev;
    }
    else if(jp==qp->q_tail)
    {
        qp->q_tail=jp->j_prev;
        jp->j_prev->j_next=jp->j_next;
    }
    else
    {
        jp->j_prev->j_next=jp->j_next;
        jp->j_next->j_prev=jp->j_prev;
    }
    pthread_rwlock_unlock(&qp->q_lock);
}

struct job* job_find(struct queue *qp, pthread_t id)
{
    struct job *jp;
    if(pthread_rwlock_rdlock(&qp->q_lock)!=0)
        return NULL;
    
    for(jp=qp->q_headp;jp!=NULL;jp=jp->j_next)
        if(pthread-equal(jp->j_id,id))
            break;
    
    pthread_rwlock_unlock(&qp->q_lock);
    return jp;
}

Using reader–writer locks

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值