鏈表和讀寫鎖實現簡單的作業調度函數 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