APUE線程同步之讀寫鎖例子

鏈表和讀寫鎖實現簡單的作業調度函數 p309

 只有在線程 搜索作業的頻率遠高於增加或者刪除作業時,使用讀寫鎖才能改善性能

#include <stdlib.h>
#include <pthread.h>

struct job {
	struct job *j_next;
	struct job *j_prev;
	pthread_t   j_id;   /* tells which thread handles this job */
	/* ... more stuff here ... */
};

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

/*
 * Initialize a queue.
 */
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);
	/* ... continue initialization ... */
	return(0);
}

/*
 * Insert a job at the head of the queue.
 */
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->q_tail = jp;	/* list was empty */
	qp->q_head = jp;
	pthread_rwlock_unlock(&qp->q_lock);
}

/*
 * Append a job on the tail of the queue.
 */
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;	/* list was empty */
	qp->q_tail = jp;
	pthread_rwlock_unlock(&qp->q_lock);
}

/*
 * Remove the given job from a queue.
 */
void
job_remove(struct queue *qp, struct job *jp)
{
	pthread_rwlock_wrlock(&qp->q_lock);
	if (jp == qp->q_head) {
		qp->q_head = jp->j_next;
		if (qp->q_tail == jp)
			qp->q_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);
}

/*
 * Find a job for the given thread ID.
 */
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_head; jp != NULL; jp = jp->j_next)
		if (pthread_equal(jp->j_id, id))
			break;

	pthread_rwlock_unlock(&qp->q_lock);
	return(jp);
}

 

ubuntu 下的PTHREAD_相關函數man(3)

pthread_atfork                    pthread_kill_other_threads_np
pthread_attr_destroy              pthread_mutexattr_destroy
pthread_attr_getaffinity_np       pthread_mutexattr_getprioceiling
pthread_attr_getdetachstate       pthread_mutexattr_getprotocol
pthread_attr_getguardsize         pthread_mutexattr_getpshared
pthread_attr_getinheritsched      pthread_mutexattr_getrobust
pthread_attr_getschedparam        pthread_mutexattr_getrobust_np
pthread_attr_getschedpolicy       pthread_mutexattr_gettype
pthread_attr_getscope             pthread_mutexattr_init
pthread_attr_getstack             pthread_mutexattr_setprioceiling
pthread_attr_getstackaddr         pthread_mutexattr_setprotocol
pthread_attr_getstacksize         pthread_mutexattr_setpshared
pthread_attr_init                 pthread_mutexattr_setrobust
pthread_attr_setaffinity_np       pthread_mutexattr_setrobust_np
pthread_attr_setdetachstate       pthread_mutexattr_settype
pthread_attr_setguardsize         pthread_mutex_consistent
pthread_attr_setinheritsched      pthread_mutex_consistent_np
pthread_attr_setschedparam        pthread_mutex_destroy
pthread_attr_setschedpolicy       pthread_mutex_getprioceiling
pthread_attr_setscope             pthread_mutex_init
pthread_attr_setstack             pthread_mutex_lock
pthread_attr_setstackaddr         pthread_mutex_setprioceiling
pthread_attr_setstacksize         pthread_mutex_timedlock
pthread_barrierattr_destroy       pthread_mutex_trylock
pthread_barrierattr_getpshared    pthread_once
pthread_barrierattr_init          pthread_rwlockattr_destroy
pthread_barrierattr_setpshared    pthread_rwlockattr_getkind_np
pthread_barrier_destroy           pthread_rwlockattr_getpshared
pthread_barrier_wait              pthread_rwlockattr_init
pthread_cancel                    pthread_rwlockattr_setkind_np
pthread_cleanup_pop               pthread_rwlockattr_setpshared
pthread_cleanup_pop_restore_np    pthread_rwlock_destroy
pthread_cleanup_push              pthread_rwlock_rdlock
pthread_cleanup_push_defer_np     pthread_rwlock_timedrdlock
pthread_condattr_destroy          pthread_rwlock_timedwrlock
pthread_condattr_getclock         pthread_rwlock_tryrdlock
pthread_condattr_getpshared       pthread_rwlock_trywrlock
pthread_condattr_init             pthread_rwlock_unlock
pthread_condattr_setclock         pthread_rwlock_wrlock
pthread_condattr_setpshared       pthread_self
pthread_cond_broadcast            pthread_setaffinity_np
pthread_cond_destroy              pthread_setattr_default_np
pthread_cond_signal               pthread_setcancelstate
pthread_cond_timedwait            pthread_setcanceltype
pthread_create                    pthread_setconcurrency
pthread_detach                    pthread_setname_np
pthread_equal                     pthread_setschedparam
pthread_exit                      pthread_setschedprio
pthread_getaffinity_np            pthread_setspecific
pthread_getattr_default_np        pthread_sigmask
pthread_getattr_np                pthread_sigqueue
pthread_getconcurrency            pthread_spin_destroy
pthread_getcpuclockid             pthread_spin_init
pthread_getname_np                pthread_spin_lock
pthread_getschedparam             pthread_spin_trylock
pthread_getspecific               pthread_spin_unlock
pthread_join                      pthread_testcancel
pthread_key_create                pthread_timedjoin_np
pthread_key_delete                pthread_tryjoin_np
pthread_kill                      pthread_yield

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章