天天看點

Linux阻塞等待線程啟動示例阻塞等待線程啟動

阻塞等待線程啟動

一、 應用場景

1. 子線程建立後不主動退出,主線程不能使用pthread_join被動等待子線程結束。

2. 主線程建立子線程之後,後續業務邏輯的處理依賴于子線程中的業務處理狀态。

二、代碼實作

代碼塊(主線程)

#define nthreads 10          // 子線程個數
static int  init_count =  ; // 已啟動的子線程個數
static pthread_mutex_t   lock = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t    cond = PTHREAD_COND_INITIALIZER;
pthread_t thread_id[nthreads];

void* thread_cb(void*); // 子線程callback聲明

for (int i = ; i < nthreads; i++) {
    pthread_create(&thread_id[i], NULL, thread_cb, NULL);
}
pthread_mutex_lock (&lock);
while (init_count < nthreads) {
    pthread_cond_wait(&cond, &lock);
}
pthread_mutex_unlock(&lock);
           

代碼塊(子線程回調)

void*
thread_cb(void *arg)
{
    /*
        do something
    */
    pthread_mutex_lock(&lock);
    init_count++;
    pthread_cond_signal(&cond);
    pthread_mutex_unlock(&lock);

    while() {
        // do something work
    }; 
    return NULL;
}
           

三、總結

代碼本身是一種生産-消費模型的基本應用。

主線程可以認為是生産者,相應的消費者即是子線程。

生産完成後利用pthread_cond_wait等待消費者的處理狀态消息。

那麼有個老生常談的問題:

pthread_cond_signal 的調用是不是一定要先加鎖再解鎖?

YES, 一定要在{lock, unlock}塊中。

繼續閱讀