pthread_cond_wait 常用套路

1、pthread_create 函數

1.1 pthread_create 創建新線程

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
//參數說明:
// 1)、(傳出參數) 新線程ID
// 2)、attr線程屬性。NULL表使用默認屬性 pthread_attr_t
// 3)、線程主函數:void *(*tfn)(void *)
// 4)、線程主函數參數

1.2. 使用例子

 pthread_t  pthread;
 pthread_create(&pthread, NULL,pthread_run, NULL);
 // pthread_run 回調函數

2、pthread_join 函數

 1. pthread_join 函數的作用  
 	等待線程運行結束退出,一般和pthread_create配對使用
 2. pthread_join(&thread, NULL);

3、互斥鎖 pthread_mutex_t 類型

  1. pthread_mutex_t 類型的初始化,分爲動態和靜態兩種
// 動態:
pthread_mutex_t lock;
pthread_mutex_init(&lock, NULL);
// 靜態:
pthead_mutex_t muetx = PTHREAD_MUTEX_INITIALIZER;

2. 銷燬:pthread_mutex_destroy(&lock);
3. 加鎖:pthread_mutex_lock(&lock);
4. 解鎖:pthread_mutex_unlock(&lock);
5. 非阻塞加鎖:pthread_mutex_trylock(&lock);


4、條件變量 pthread_cond_t 類型

  1. pthread_cond_t 類型的初始化,分爲動態和靜態兩種
// 動態:pthread_cond_t
// int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);
pthread_cond_t cond;
pthread_cond_init(&cond,NULL);
// 靜態:
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
  1. 退後用完需要銷燬
 pthread_cond_destroy (&cond);

5、 pthread_cond_t 和 pthread_mutex_t 結合使用

  1. pthread_cond_wait
 int pthread_cond_wait(pthread_cond_t * cond, pthread_mutex_t * mutex);
pthread_cond_wait 是阻塞等待函數,它的內部結構是:

首先 pthread_cond_wait前要先加鎖,其次pthread_cond_wait內部會解鎖,然後等待條件變量被其它線程激活,最後pthread_cond_wait被激活後會再自動加鎖

  1. pthread_cond_timedwait
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime);
// 作用:其中計時等待方式如果在給定時刻前條件沒有滿足,則返回ETIMEOUT,結束等待
// 例子:
struct timespec    ts;
clock_gettime(CLOCK_REALTIME, &ts);
ts.tv_nsec += 100*1000*1000;
ts.tv_sec  += ts.tv_nsec / 1000000000;
ts.tv_nsec %= 1000000000;
pthread_cond_timedwait(&cond, & lock, &ts);
  1. pthread_cond_signal函數

作用:喚醒(至少)一個阻塞在條件變量上的線程
使用例子:pthread_cond_signal(&cond);

  1. pthread_cond_broadcast
    喚醒全部阻塞在條件變量上的線程
  2. pthread_cond_wait 的常用套路
 // 等待線程:
pthread _mutex_lock(&mutex)
whileif(線程執行的條件是否成立)
      pthread_cond_wait(&cond, &mutex);
// 線程執行
pthread_mutex_unlock(&mutex);

// 激活線程:
pthread_mutex_lock(&mutex);
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章