異步化方案

最近做項目,需要調用的一些服務,但是這個服務本身和主線程沒有什麼關聯,所以這時候我們可以將其異步化,從而提升整體的性能。
然後我是怎麼做的呢?
第一步,肯定是要開啓線程,初始化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)

子線程就鎖住緩衝區進行操作了。

其實這個設計的主要思路是,父線程驅動子線程。可以多考慮考慮,這種情況不會死鎖。

点赞