最近做項目,需要調用的一些服務,但是這個服務本身和主線程沒有什麼關聯,所以這時候我們可以將其異步化,從而提升整體的性能。
然後我是怎麼做的呢?
第一步,肯定是要開啓線程,初始化mutex
pthread_mutex_t locker;
pthread_cond_t cond;
pthread_t thread;
queue<AsynJob *> m_qtransfer; //隊列作爲緩衝區
pthread_mutex_init(&locker, NULL);//初始化鎖
pthread_cond_init(&cond, NULL);//初始化條件,它的作用後續會講到
ret = pthread_create(&thread, NULL, ProcessCycle, reinterpret_cast<void *>(i));//創建線程
我們在生產的時候,怎麼做呢?
pthread_mutex_lock(&locker[job_kind]);
m_qtransfer.push(job);
pthread_cond_signal(&cond[job_kind]);
pthread_mutex_unlock(&locker[job_kind]);
我們在消費的時候怎麼做呢?
pthread_mutex_lock(&transfer->locker);
while(!transfer->thread_exit) {
if (transfer->m_qtransfer.empty())
{
pthread_cond_wait(&transfer->cond, &transfer->locker);
continue;
}
...取出對隊列裏的任務
pthread_mutex_unlock(&transfer->locker);
...執行任務
pthread_mutex_lock(&transfer->locker);
}
整個操作的核心在於pthread_cond_wait和pthread_cond_signal那句:
子線程上來的時候,先鎖住緩衝區,如果緩衝區爲空,就執行pthread_cond_wait,
這條語句相當於下面兩句話形成原子操作
unlock(locker)
sleep();
然後pthread_cond_signal執行之後喚醒子線程進行操作了等於
wake 子線程
lock(locker)
子線程就鎖住緩衝區進行操作了。
其實這個設計的主要思路是,父線程驅動子線程。可以多考慮考慮,這種情況不會死鎖。