2012-04-13 55 views
1

作爲我第一次真正嘗試使用pthreads,我正在尋找適合已經編寫的我的應用程序來使用線程。「主」線程監控「奴隸」線程的簡單方法

我想到的範例基本上有一個「主」線程,它遍歷待處理的數據項目列表,爲每個線程啓動一個新線程,MAX_THREADS線程在任何給定時間運行(直到數字的剩餘任務少於這個),每個任務在列表中的單個數據元素上執行相同的任務。

主線程需要知道任何線程何時完成其任務並返回(或pthread_exit()'ed),立即啓動一個新線程來執行列表中的下一個任務。

我想知道的是人們喜歡使用這種設計的方法是什麼?拋開數據考慮,最簡單的一組pthread函數用於實現這一點?顯然,pthread_join()是作爲在線程上「檢查」的手段。

早期的實驗已經使用了一個struct,作爲pthread_create()的最後一個參數傳遞,它包含一個名爲「running」的元素,線程在啓動時設置爲true,並在返回之前重置。主線程簡單地檢查循環中每個線程的這個struct元素的當前值。

下面是程序使用的線程管理數據:

typedef struct thread_args_struct 
{ 
    char *data;   /* the data item the thread will be working on */ 
    int index;   /* thread's index in the array of threads */ 
    int thread_id;  /* thread's actual integer id */ 
    int running;  /* boolean status */ 
    int retval;   /* value to pass back from thread on return */ 
} thread_args_t; 

/* 
* array of threads (only used for thread creation here, not referenced 
* otherwise) 
*/ 
pthread_t  thread[MAX_THREADS]; 

/* 
* array of argument structs 
* 
* a pointer to the thread's argument struct will be passed to it on creation, 
* and the thread will place its return value in the appropriate struct element 
* before returning/exiting 
*/ 
thread_args_t thread_args[MAX_THREADS]; 

這是否看起來像一個完善的設計?有更好,更標準化的方法來監視線程的運行/退出狀態,更「線程化」的方式嗎?我期望使用最簡單,最清潔,最乾淨的機制,這不會導致任何意外的併發症。

感謝您的任何反饋意見。

回答

0

作爲(通用)多線程方式沒有太多的「pthreads-y」方式。你所擁有的沒有什麼問題,但它比需要的更復雜,效率更低。

更標準的設計是使用線程池。主線程產生一堆讀取隊列的工作線程。主人將工作放在隊列中,所有工作人員在處理隊列中的工作時都會採取一些措施。這消除了不斷啓動和終止線程的需要(儘管更復雜的池可以有一些機制來根據工作負載來增加/減少池大小)。如果線程必須返回數據或狀態信息,則可以使用主機可以讀取的輸出隊列(也許只是指向實際數據的指針)。

這仍然留下了如何在完成處理後襬脫線程的問題。同樣,這是一個工人關係,所以建議主人告訴奴隸關閉自己。這相當於使用某些程序切換(例如您目前擁有的),在某處使用條件變量,發送信號或取消線程。這裏有很多關於這個話題的問題(和很好的答案)。

+0

謝謝,鴨子,是的,我喜歡你的建議。但唯一的問題是,我確實需要在設計中進行一定程度的同步。 – 2012-04-15 15:28:01

+0

(oops,點擊輸入太快)主線程需要等待一組完成的奴隸,所以它可以使用它們生成的一些信息來創建一個輸出文件。我認爲我需要對設計進行更多的思考。它*會很好,不會在線程管理中陷入困境,而只是讓一切或多或少地自動合作。將不得不思考這一點。非常感謝。 – 2012-04-15 15:41:46