2011-09-22 56 views
1

我已經開始嘗試使用ios平臺的POSIX線程。使用NSThread來回復它是相當艱鉅的。POSIX線程在ios上

基本上在我的示例應用程序中,我有一個大數組填充類型mystruct。每隔一段時間(非常頻繁),我都想執行一個任務,其中一個結構的內容在的背景中,所以我將它傳遞給detachnewthread以解決問題。

我認爲我有基礎知識,但我想在嘗試轉向更復雜的東西之前獲得專業意見。 我在這裏有什麼似乎「o.k」,你能指出任何可能導致問題的缺失嗎?你可以發現任何內存管理問題等...

struct mystruct 

{ 
pthread thread; 

int a; 
long c; 

} 


void detachnewthread(mystruct *str) 
{ 

    // pthread_t thread; 

    if(str) 
    { 
    int rc; 
     // printf("In detachnewthread: creating thread %d\n", str->soundid); 
     rc = pthread_create(&str->thread, NULL, DoStuffWithMyStruct, (void *)str); 
     if (rc){ 
      printf("ERROR; return code from pthread_create() is %d\n", rc); 
      //exit(-1); 
     } 

    } 

    // 
    /* Last thing that main() should do */ 
    // pthread_exit(NULL);  


} 



void *DoStuffWithMyStruct(void *threadid) 
{ 
    mystruct *sptr; 
    dptr = (mystruct *)threadid; 



    // do stuff with data in my struct 
    pthread_detach(soundptr->thread); 

} 

回答

1

一個潛在的問題是如何在結構mystruct傳遞存儲中創建。該變量的生命週期對其在線程中的使用非常關鍵。例如,如果detachnewthread的調用者已經在堆棧中聲明並在線程完成之前返回,則它將是未定義的行爲。同樣,如果它是動態分配的,那麼在線程完成之前有必要確保它沒有被釋放。

迴應評論/問題:某種互斥體的必要性取決於用法。爲了討論,我將假定它是動態分配的。如果調用線程在創建「子」線程之前填充了結構的內容,並且可以保證在子線程退出之後它不會被釋放,並且隨後的訪問是隻讀的,那麼您不需要互斥體來保護它。如果結構包含子線程完成任務所需的信息,我可以想象這種情況。

然而,如果不止一個線程將訪問該結構的內容一個或多個線程將被改變的數據(寫入結構),那麼你可能需要一個互斥量,以保護它。

+0

以防止被修改或從內存中刪除的安全性我想我們會說互斥對嗎? – dubbeat

+0

@dubbeat:我添加了一些信息來試圖回答這個問題。如果您提供更多關於子線程如何使用結構內容的細節,我(或其他人)可能會給出更詳細的答案。 –

1

嘗試使用蘋果公司的大中央調度(GCD),它將爲您管理線程。 GCD提供了通過塊將工作分派到由系統管理的各種隊列的功能。一些隊列類型是併發的,串行的,當然也是UI運行的主要隊列。根據手頭的CPU資源,系統將管理隊列和必要的線程以完成工作。一個簡單的例子,它顯示了你怎麼可以嵌套調用不同的隊列是這樣的:

__block MYClass *blockSelf=self; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    [blockSelf doSomeWork]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [blockSelf.textField setStringValue:@"Some work is done, updating UI"]; 
    }); 
}); 

__block MyClass的* blockSelf =自簡直是用來避免保留與塊是如何工作的相關週期。

蘋果的文檔: http://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html

邁克灰Q值&博客文章: http://mikeash.com/pyblog/friday-qa-2009-08-28-intro-to-grand-central-dispatch-part-i-basics-and-dispatch-queues.html

+0

同意。除非您從其他平臺移植代碼,否則沒有實際的理由可以考慮在iOS上直接使用POSIX線程。蘋果的其他機制(特別是GCD)更強大,更優化,更易於使用。 –

+0

使用ARC時,'__block'不會阻止循環引用,所以您需要使用'__weak'(或iOS 4之前的'__unsafe_unretained')。無論如何,如果對象要保留對塊的引用,則只需要防止保留週期,在這種情況下,它不是。 – Kevin