APUE 執行緒 程式清單

2021-09-07 13:12:43 字數 4690 閱讀 1697

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...