Linux 和 多線程

每次都是用到,查一下,寫下,這次稍微記錄下筆記。

#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);  // 銷燬

 

 

 

 

 

發佈了53 篇原創文章 · 獲贊 4 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章