從技術上講,一個線程被定義為一個獨立的指令流。
一個程序可以包含一個或多個線程。
線程操作包括線程建立,終止,同步(連接配接,阻塞),排程,資料管理和程序互動。
程序内的所有線程共享:
相同的位址空間
信号
檔案描述符
工作目錄
使用者群組 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
┆涼┆暖┆降┆等┆幸┆我┆我┆裡┆将┆ ┆可┆有┆謙┆戮┆那┆ ┆大┆始┆ ┆然┆
┆薄┆一┆臨┆你┆的┆還┆沒┆ ┆來┆ ┆是┆來┆遜┆沒┆些┆ ┆雁┆終┆ ┆而┆
┆ ┆暖┆ ┆如┆地┆站┆有┆ ┆也┆ ┆我┆ ┆的┆有┆精┆ ┆也┆沒┆ ┆你┆
┆ ┆這┆ ┆試┆方┆在┆逃┆ ┆會┆ ┆在┆ ┆清┆來┆準┆ ┆沒┆有┆ ┆沒┆
┆ ┆生┆ ┆探┆ ┆最┆避┆ ┆在┆ ┆這┆ ┆晨┆ ┆的┆ ┆有┆來┆ ┆有┆
┆ ┆之┆ ┆般┆ ┆不┆ ┆ ┆這┆ ┆裡┆ ┆沒┆ ┆殺┆ ┆來┆ ┆ ┆來┆