阻塞等待線程啟動
一、 應用場景
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}塊中。