Linux 線程相關函數
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 類型
- 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 類型
- 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;
- 退後用完需要銷燬
pthread_cond_destroy (&cond);
5、 pthread_cond_t 和 pthread_mutex_t 結合使用
- 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被激活後會再自動加鎖
- 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);
- pthread_cond_signal函數
作用:喚醒(至少)一個阻塞在條件變量上的線程
使用例子:pthread_cond_signal(&cond);
- pthread_cond_broadcast
喚醒全部阻塞在條件變量上的線程 - pthread_cond_wait 的常用套路
// 等待線程:
pthread _mutex_lock(&mutex)
while或if(線程執行的條件是否成立)
pthread_cond_wait(&cond, &mutex);
// 線程執行
pthread_mutex_unlock(&mutex);
// 激活線程:
pthread_mutex_lock(&mutex);
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);