每次都是用到,查一下,寫下,這次稍微記錄下筆記。
#include <pthread.h>
編譯得時候需要-lpthread
和Thread相關,基本的有3個概念:線程的建立和銷燬;線程鎖;線程條件
關於建立線程:
ret = pthread_create(&thread_id, NULL, Do_Thread, &Do_Thread_Para);
// 第2參數是thread 屬性,一般我不用設置
// 第4個參數是Do_Thread的入口參數,一般我傳一個結構體進去
關於銷燬線程:
等待線程結束:pthread_join
強行殺掉線程:pthread_exit
讓線程自生自滅:pthread_detach
我一般用的是第一個:
pthread_join(thread_id, &Do_Thread_ret);
// 第二個參數是線程返回值
關於線程鎖:當要在多個線程共享某些變量的時候,就需要用鎖。這樣可以保證一個時間點,只有一個線程能夠訪問這個線程
pthread_mutex_t mMutexData;
pthread_mutex_init(&(mMutexData), NULL); // 第2個參數是鎖的屬性,我一般用默認,NULL
pthread_mutex_lock(&mMutexData); // 加鎖
pthread_mutex_unlock(&mMutexData) // 去鎖
pthread_mutex_destroy(&mMutexData) // 銷燬
關於條件:當某個線程需要等待其他線程處理完某個數據(運行到某個點)的話,就需要用條件,一般加個時間參數,以防止死等下去。
pthread_cond_t *sConditionData;
pthread_cond_init(&(sConditionData), NULL); // 第2個參數是鎖的屬性,我一般用默認,NULL
pthread_mutex_lock(&mMutexData); // 一般條件必須和鎖加在一起用,以保證條件變量不重入
pthread_cond_signal(&sConditionData); // 發信號
pthread_mutex_unlock(&mMutexData);
struct timespec ts;
struct timeval sTime;
struct timezone sTimeZone;
long res;
pthread_mutex_lock(&(pApp->mMutexData));
gettimeofday(&sTime, &sTimeZone);
ts.tv_sec = sTime.tv_sec;
ts.tv_nsec += 5sTime. tv_usec * 1000 +20*1000*1000; // 20 ms
ret = pthread_cond_timedwait(&(pApp->sConditionData), &(pApp->mMutexData), &ts); // 等候
if(ret == ETIMEDOUT)
{
pthread_mutex_unlock(&(pApp->mMutexData));
continue;
}
pthread_mutex_unlock(&(pApp->mMutexData));
pthread_cond_destroy(&sConditionData); // 銷燬