天天看點

Pthread 用法筆記

從技術上講,一個線程被定義為一個獨立的指令流。

一個程序可以包含一個或多個線程。

線程操作包括線程建立,終止,同步(連接配接,阻塞),排程,資料管理和程序互動。

程序内的所有線程共享:

相同的位址空間

信号

檔案描述符

工作目錄

使用者群組 ID

每個線程具有單獨的:

堆棧指針

寄存器

排程屬性(如政策或優先級)

線程特定的資料

上下文切換的開銷減小,提高了效率。

共享存儲器,友善構造并發伺服器。

同時通路同一個變量的沖突。

缺乏健壯性,一個線程故障可能就需要終止整個程序。

POSIX 線程庫是 C/C++ 的基于标準的線程API。

利用它我們可以操作線程,開發并行處理的程式。

一個簡單的例子:

上面我們用到了 <code>pthread_create</code> 來建立線程。

線程函數的參數必須通過引用傳遞并轉換為<code>(void *)</code>。

若要傳遞多個參數,可建立一個包含所有參數的結構體,再傳遞指向該結構體的指針。

如果傳遞的參數是一個變量的位址,由于這是共享記憶體空間,變量對所有線程可見,很有可能在新線程通路它之前,此記憶體位置的值發生了更改。

線程正常執行完後傳回。

線程調用 <code>pthread_exit</code>。

線程被另一個線程通過 <code>pthread_cancel</code> 取消。

整個程序因調用 <code>exec()</code> 或 <code>exit()</code> 而終止。

<code>main()</code> 先完成,且沒有顯式調用 <code>pthread_exit</code> 。

如果沒有顯式地調用 <code>pthread_exit()</code>, <code>main()</code> 就會在它産生的線程之前完成,那麼所有線程都将終止。

顯示調用 <code>pthread_exit()</code>,則<code>main()</code> 會在結束前等待所有線程執行完畢。

我們也可以在 <code>main()</code> 中調用 <code>pthread_join(t, NULL);</code> 來連接配接子線程,連接配接後,目前線程就會阻塞并等待子線程 t 的結束。

另外建立時線程時可以通過線程屬性指定是否可被連接配接。

Unix 的常見的線程同步機制:互斥(mutex)、信号量(semaphore)和條件變量(condition variable)。

互斥鎖:阻止其他線程通路變量。

連接配接(join):讓一個線程等待,直到其他人終止。(上面已經提到)

條件變量:資料類型 <code>pthread_cond_t</code>。

Mutex是“互斥”(mutual exclusion)的縮寫。

互斥變量必須聲明為<code>pthread_mutex_t</code>類型,并且必須在可以使用它們之前進行初始化。有兩種方法來初始化互斥變量:

<code>pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER;</code>

使用<code>pthread_mutex_init()</code>。該方法允許設定互斥對象屬性 attr。

互斥變量最初是未上鎖的。

一個條件變量總是與一個互斥鎖一起使用。

參考1. POSIX thread (pthread) libraries

參考2. POSIX Threads Programming

┆涼┆暖┆降┆等┆幸┆我┆我┆裡┆将┆ ┆可┆有┆謙┆戮┆那┆ ┆大┆始┆ ┆然┆

┆薄┆一┆臨┆你┆的┆還┆沒┆ ┆來┆ ┆是┆來┆遜┆沒┆些┆ ┆雁┆終┆ ┆而┆

┆ ┆暖┆ ┆如┆地┆站┆有┆ ┆也┆ ┆我┆ ┆的┆有┆精┆ ┆也┆沒┆ ┆你┆

┆ ┆這┆ ┆試┆方┆在┆逃┆ ┆會┆ ┆在┆ ┆清┆來┆準┆ ┆沒┆有┆ ┆沒┆

┆ ┆生┆ ┆探┆ ┆最┆避┆ ┆在┆ ┆這┆ ┆晨┆ ┆的┆ ┆有┆來┆ ┆有┆

┆ ┆之┆ ┆般┆ ┆不┆ ┆ ┆這┆ ┆裡┆ ┆沒┆ ┆殺┆ ┆來┆ ┆ ┆來┆

繼續閱讀