【Linux】條件變數與訊號量
1.定義訊號量 sem_t sem;
2.初始化訊號量 int sem_init(sem_t *sem, int pshared, unsigned int value);
a. sem地址 b. 0表示本程序中多個執行緒間同步,非0表示可以跨程序的同步操作。c. 訊號量初值(計數器的值)
3.PV操作
P int sem_wait(sem_t *sem); // sem-1 如果小於0就阻塞
V int sem_post(sem_t *sem); // sem+1
4.銷燬 int sem_destroy(sem_t *sem);
倉庫存放東西有限
生產者
while (1)
{
pthread_mutex_lock();
sem_wait(sem_full);
生產
sem_post(sem_empty);
pthread_mutex_unlock();
}
消費者
while (1)
{
pthread_mutex_lock();
sem_wait(sem_empty);
消費
sem_post(sem_full);
pthread_mutex_unlock();
}
場景:http伺服器是基於短連線的,那麼在網頁上的訪問就會頻繁地建立和銷燬執行緒,這樣開銷是很大的。
執行緒池(生產者消費者模型)
根據系統性能建立合適大小的執行緒池。
將建立的執行緒存入線上程池中,需要執行緒時,就讓它們建立聯絡,不想用了,就斷開聯絡。
1.執行緒池中有若干個執行緒
2.用於執行大量相對短暫的任務
計算密集型任務:大量的時間佔用CPU進行運算。
執行緒池中執行緒的個數等於CPU個數,避免執行緒切換。
IO密集型任務:大量的時間佔用CPU在阻塞等待IO。
執行緒池中執行緒個數大於CPU個數。
當任務增加時,可以動態增加執行緒池中執行緒的個數。當任務執行完成後,可以動態減少執行緒池中執行緒個數。
需求:
生產者執行緒向任務佇列中新增任務,任務佇列中有任務,如果執行緒池中有等待執行緒就喚醒它並執行任務,如果執行緒池中沒有
等待執行緒,並且沒有達到上限,就新增新的執行緒到執行緒池。
沒有任務執行就等待,有任務則去執行。
typedef struct condition
{
pthread_mutex_t mutex;
pthread_cond_t cond;
}condition_t;
// 任務佇列
typedef struct task
{
void *(pfun)(void *); // 任務佇列的回撥函式(管理任務的)
void *arg; // 回撥函式傳入的引數
struct task *next;
}task_t;
typedef struct threadpool
{
condition_t cond; // 同步與互斥
task_t *first; // 任務佇列的隊頭
task_t *tail; // 任務佇列的隊尾
int max_thread; // 最大執行緒個數
int idle; // 空閒執行緒個數 如果有空閒執行緒,此時可以signal通知下
int counter; // 當前執行緒池中的執行緒個數
int quit; // 如果為1表示退出,為0表示不退出
}threadpool_t;
// 初始化
void threadpool_init(threadpool_t *pool, int max);
// 往執行緒池新增任務
void threadpool_add(threadpool_t *pool, void*(*pf)(void*), void *arg);
// 銷燬執行緒池
void threadpool_destroy(threadpool_t *pool);
pthread_cond_broadcast(); // 喚醒所有
pthread_cond_signal(); // 只喚醒一個
---------------------
作者:sustzc
來源:CSDN
原文:https://blog.csdn.net/sustzc/article/details/82734994
版權宣告:本文為博主原創文章,轉載請