2012-04-06 124 views
0
gcc (GCC) 4.6.3 
c89 

你好,創建和銷燬線程

我只是想知道這是否是處理由主創建的工作/後臺線程的最佳方式?

我這樣做對吧?這是我第一次完成任何多線程程序。只是想確保我在正確的軌道上,因爲這將不得不擴展到添加更多的線程。

我有一個線程用於發送消息,另一個用於接收消息。

非常感謝您的任何建議,工人/後臺線程的

int main(void) 
{ 
    pthread_t thread_send; 
    pthread_t thread_recv; 

    int status = TRUE; 

    /* Start thread that will send a message */ 
    if(pthread_create(&thread_send, NULL, thread_send_fd, NULL) == -1) { 
     fprintf(stderr, "Failed to create thread, reason [ %s ]", 
       strerror(errno)); 
     status = FALSE; 
    } 

    if(status != FALSE) { 
     /* Thread send started ok - join with the main thread when its work is done */ 
     pthread_join(thread_send, NULL); 

     /* Start thread to receive messages */ 
     if(pthread_create(&thread_recv, NULL, thread_receive_fd, NULL) == -1) { 
      fprintf(stderr, "Failed to create thread for receiving, reason [ %s ]", 
        strerror(errno)); 
      status = FALSE; 

      /* Cancel the thread send if it is still running as the thread receive failed to start */ 
      if(pthread_cancel(thread_send) != 0) { 
       fprintf(stderr, "Failed to cancel thread for sending, reason [ %s ]", 
         strerror(errno)); 
      } 
     } 
    } 

    if(status != FALSE) { 
     /* Thread receive started ok - join with the main thread when its work is done */ 
     pthread_join(thread_recv, NULL); 
    } 

    return 0; 
} 

實例發送消息,例如只

void *thread_send_fd() 
{ 
    /* Send the messages when done exit */ 

    pthread_exit(NULL); 
} 

回答

2

當這種結構的可能有正當理由的唯一時間是如果只有一個消息被交換,那麼即使這樣,也可能會有一些問題。

如果在應用程序運行期間不斷交換消息,那麼將兩個線程編寫爲循環並且永不終止它們更爲常見。這意味着不會持續創建/終止/銷燬開銷,也不會產生死鎖生成器(AKA連接)。它有一個缺點 - 這意味着你必須涉及線程間通信的信號,隊列等,但是如果你編寫了很多多線程應用程序,這將會發生。

無論哪種方式,通常先啓動rx線程。如果首先啓動tx線程,那麼rx數據在rx線程啓動之前可能會被重新調用並丟棄。

1

這是每條消息完成一次嗎?看起來這個調用創建了一個線程來發送1個消息,另一個線程等待1個響應。然後,這個電話,我假設整個節目,只是等待整個事情完成。假設接收者在發送者完成發送之前不能做任何事情,這對於提高程序的真實或感知性能沒有任何作用。具體來說,我們需要知道發件人和收件人的真實情況,然後才能確定是否有任何好處。對於任何好處,發件人線程和接收器線程必須有他們可以同時執行的工作 ....不是連續的。如果意圖是不讓程序等待發送和接收事務,那麼這根本就沒有這樣做。