apue 執行緒 - 程式清單
程式清單11-1 列印執行緒id
#include "util.h"
#includepthread_t ntid;
void
printids(const char *s)
void *
thr_fn(void *arg)
intmain(void)
程式清單11-2 獲得執行緒退出狀態
#include "util.h"
#include void *
thr_fn1(void *arg)
void *
thr_fn2(void *arg)
intmain(void)
程式清單11-3 pthread_exit 的引數不對使用
#include "util.h"
#include struct foo ;
void
printfoo(const char *s, const struct foo *fp)
void *
thr_fn1(void *arg)
; printfoo("thread 1:\n", &foo);
pthread_exit((void *)&foo);
//這裡是自己主動變數。退出的時候僅僅是告知監聽者退出狀態碼所在的位址。可是裡面的內容在函式退出時就變了;
}void *
thr_fn2(void *arg)
intmain(void)
程式清單11-4 執行緒清理處理程式
#include "util.h"
#include void
cleanup(void *arg)
void *
thr_fn1(void *arg)
void *
thr_fn2(void *arg)
intmain(void)
程式清單11-5 使用相互排斥量保護資料結構
#include #include #include struct foo ;
struct foo *
foo_alloc(void) /* allocate the object */
/* ... continue initialization ... */
} return(fp);
}void
foo_hold(struct foo *fp) /* add a reference to the object */
void
foo_rele(struct foo *fp) /* release a reference to the object */
else
}void *thr_fn1(void *pp)
void *thr_fn2(void *pp)
int
main()
程式清單11-6 使用兩個相互排斥量
#include #include #define nhash 29
#define hash(fp) (((unsigned long)fp)%nhash)
struct foo *fh[nhash];
pthread_mutex_t hashlock = pthread_mutex_initializer;
struct foo ;
struct foo *
foo_alloc(void) /* allocate the object */
idx = hash(fp);
pthread_mutex_lock(&hashlock);
fp->f_next = fh[idx];
fh[idx] = fp->f_next;
pthread_mutex_lock(&fp->f_lock);
pthread_mutex_unlock(&hashlock);
/* ... continue initialization ... */
thread_mutex_unlock(&fp->f_lock);
} return(fp);
}void
foo_hold(struct foo *fp) /* add a reference to the object */
struct foo *
foo_find(int id) /* find an existing object */
} pthread_mutex_unlock(&hashlock);
return(fp);
}void
foo_rele(struct foo *fp) /* release a reference to the object */
/* remove from list */
idx = hash(fp);
tfp = fh[idx];
if (tfp == fp) else
pthread_mutex_unlock(&hashlock);
pthread_mutex_unlock(&fp->f_lock);
pthread_mutex_destroy(&fp->f_lock);
free(fp);
} else
}
程式清單11-7 簡化的加,解鎖
#include #include #define nhash 29
#define hash(fp) (((unsigned long)fp)%nhash)
struct foo *fh[nhash];
pthread_mutex_t hashlock = pthread_mutex_initializer;
struct foo ;
struct foo *
foo_alloc(void) /* allocate the object */
idx = hash(fp);
pthread_mutex_lock(&hashlock);
fp->f_next = fh[idx];
fh[idx] = fp;
pthread_mutex_lock(&fp->f_lock); // why ?
?? pthread_mutex_unlock(&hashlock); /* ... continue initialization ... */ } return fp; } void foo_hold(struct foo *fp) /* add a reference to the object */ struct foo * foo_find(int id) /* find an existing object */ } pthread_mutex_unlock(&hashlock); return fp; } void foo_rele(struct foo *fp) /* release a reference to the object */ else pthread_mutex_unlock(&hashlock); pthread_mutex_destroy(&fp->f_lock); free(fp); } else }
程式清單11-8 使用讀寫鎖
#include #include struct job ;
struct queue ;
/* * initialize a queue.
*/int
queue_init(struct queue *qp)
/* * insert a job at the head of the queue.
*/void
job_insert(struct queue *qp, struct job *jp)
/* */
void
/* * remove the given job from a queue.
*/void
job_remove(struct queue *qp, struct job *jp)
else if (jp == qp->q_tail) else
pthread_rwlock_unlock(&qp->q_lock);}/*
* find a job for the given thread id.
*/struct job *
job_find(struct queue *qp, pthread_t id)
程式清單11-9 使用條件變數
#include struct msg ;
struct msg *workq;
pthread_cond_t qready = pthread_cond_initializer;
pthread_mutex_t qlock = pthread_mutex_initializer;
void
process_msg(void)
}void
enqueue_msg(struct msg *mp)
APUE學習筆記 執行緒
採用多執行緒模式可以採用同步程式設計,而非非同步程式設計,可以簡化程式設計 多個程序間可以很方便的共享資料 可以通過pthread self獲得自身的執行緒id。執行緒id只在程序內部唯一。新建立執行緒不能保證那個執行緒先執行,新縣城可以訪問程序的位址空間,繼承執行緒的浮點環境和訊號遮蔽字。如果任意...
APUE學習 執行緒(1)
執行緒 thread 輕量級的程序 cpu排程的最小單位,相比較於程序,程序是分配資源的最小單位。之前講到的是多程序程式設計,這一部分要說的是如何在乙個程序中實現多執行緒程式設計 當然將程序部分的內容放到一起,就可以實現多程序多執行緒程式設計 posix 可移植性作業系統介面 規定了可移植性的執行緒...
APUE之執行緒初探
執行緒 什麼是執行緒?很多介紹都是 輕量級的程序 不過感覺執行緒的定義一直都比較模糊,沒有找到什麼具體的定義。倒是覺得 程序是資源分配的最小單位,執行緒是排程的基本單位 這個說法算是比較認可的。現在主要探索的就是apue中提供的關於執行緒的相關函式。執行緒標示 和程序一樣,執行緒也有自己的id,li...