Linux多任務編程——線程

來源:互聯網
上載者:User

標籤:tcp   hive   而且   編程   不能   world   程式   多任務   地址   

線程基礎

  △ 由於進程的地址空間是私人的,因此在進行環境切換時,系統開銷比較大

  △ 在同一個進程中建立的線程共用該進程的地址空間

  △ 通常線程值得是共用相同地址空間的多個任務

  △ 每個線程的私人這些私人資源:線程ID、PC(程式計數器)和相關寄存器、棧{局部變數,函數返回地址}、錯誤號碼、訊號掩碼和優先順序、執行狀態和屬性

  △ 線程間同步和互斥機制有:訊號量、互斥鎖、條件變數

 

1--- 線程相關函數

   在Linux中一般通過第三方線程庫來實現: 以下主要是 New POSIX Thread Library (NPTL);

   #include <pthread.h>

   int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*routine)(void *), void *arg);      //建立一個新線程

   thread:要建立的線程        attr:指定的線程屬性, NULL表示預設屬性        routine:線程中要執行的函數        argv:傳遞給線程執行的函數的參數

   返回鍵  成功:0     出錯:錯誤號碼

   int pthread_join(pthread_t thread, void **value_ptr);    //等待一個線程的結束

   thread:要等待的線程;        value_ptr:指標*value_ptr指向線程返回的參數

   傳回值  成功:0     出錯:錯誤號碼

   void pthread_exit(void *value_ptr);     //退出線程

   value_ptr:線程退出時的傳回值

   int pthread_cancel(pthread_t thread);        //給線程發送終止訊號

   thread:要發送訊號的進程

 

2--- 多線程編程樣本

 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <pthread.h> 5  6 char message[32] = "Hello world"; 7 void *thread_function(void *arg); 8  9 int main(int argc, char *argv[])10 {11     pthread_t a_thread;12     void *thread_result;13     14    if (pthread_create(&a_thread, NULL, thread_function, (void *)message) < 0);            //使用預設屬性建立線程15    {16         perror("fail to pthread create");17         exit(-1);18     }19     printf("waiting for thread to finish\n");20     if (pthread_join(a_thread, &thread_result) < 0)            //等待線程結束21     {22          perror("fail to pthread join");23          exit(-1); 24     }25     printf("MESSAGE is now %s\n", message);26 27     return 0;28 }29 30 void *thread_function(void *arg)31 {32  33     srtcpy(message, "marked by thread");34     pthread_exit("Thank you for the cpu time");35 }

 

3--- 編譯多線程程式

  # gcc -o sample sample.c -lpthread -D_REENTRANT

  -lpthred:;連結pthread庫

  -D_REENTRANT:產生可重新進入代碼

  pthread_key_create(); 線程私人資料  unix/linux下線程私人資料實現原理及使用方法

 

4--- 線程池 thread_pool

  大多數的網路伺服器,包括Web伺服器都具有一個特點,就是單位時間內必須處理數目巨大的串連請求,但是處理時間卻是比較短的。在傳統的多線程伺服器模型中是這樣實現的:一旦有個請求到達,就建立一個新的線程,由該線程執行任務,任務執行完畢之後,線程就退出。這就是"即時建立,即時銷毀"的策略。儘管與建立進程相比,建立線程的時間已經大大的縮短,  但是如果提交給線程的任務是執行時間較短,而且執行次數非常頻繁,那麼伺服器就將處於一個不停的建立線程和銷毀線程的狀態。這筆開銷是不可忽略的,尤其是線程執行的時間非常非常短的情況。

  線程池就是為瞭解決上述問題的,它的實現原理是這樣的:在應用程式啟動之後,就馬上建立一定數量的線程,放入閒置隊列中。這些線程都是處於阻塞狀態,這些線程只佔一點內,不佔用CPU。當任務到來後,線程池將選擇一個閒置線程,將任務傳入此線程中運行。當所有的線程都處在處理任務的時候,線程池將自動建立一定的數量的新線程,用於處理更多的任務。執行任務完成之後線程並不退出,而是繼續線上程池中等待下一次任務。當大部分線程處於阻塞狀態時,線程池將自動銷毀一部分的線程,回收系統資源。

  下面是一個簡單線程池的實現,這個線程池的代碼是我參考網上的一個例子實現的,由於找不到出處了,就沒辦法註明參考自哪裡了。它的方案是這樣的:程式啟動之前,初始化線程池,啟動線程池中的線程,由於還沒有任務到來,線程池中的所有線程都處在阻塞狀態,當一有任務到達就從線程池中取出一個空閑線程處理,如果所有的線程都處於工作狀態,就添加到隊列,進行排隊。如果隊列中的任務個數大於隊列的所能容納的最大數量,那就不能新增工作到隊列中,只能等待隊列不滿才能新增工作到隊列中。

  實現代碼:簡單Linux線程池 http://www.cnblogs.com/venow/archive/2012/11/22/2779667.html

 

Linux多任務編程——線程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.