2012-12-21 26 views
1

我有這個線程FCGI應用程序,滋生N個線程,並等待他們退出重生線程

#include "vips/vips.h" 
#include "vips/vips" 
#include <stdio.h> 
#include <stdlib.h> 
#include <iostream> 
#include "tiff.h" 
#include "tiffio.h" 
#include "fastcgi.h" 
#include "fcgio.h" 
#include "Tokenizer.h" 
#include "string.h" 
#include <sstream> 
#include <pthread.h> 
#include <sys/types.h> 

using namespace std; 
using namespace vips; 

#define THREAD_COUNT 2 
static int counts[THREAD_COUNT]; 

static void *handleFcgi(void *a) 
{ 
    int rc, i, thread_id = (intptr_t)a; 
    pid_t pid = getpid(); 
    FCGX_Request request; 
    char *server_name; 

    FCGX_InitRequest(&request, 0, 0); 
    for (;;) 
    { 
     static pthread_mutex_t accept_mutex = PTHREAD_MUTEX_INITIALIZER; 
     static pthread_mutex_t counts_mutex = PTHREAD_MUTEX_INITIALIZER; 

     /* Some platforms require accept() serialization, some don't.. */ 
     pthread_mutex_lock(&accept_mutex); 
     rc = FCGX_Accept_r(&request); 
     pthread_mutex_unlock(&accept_mutex); 

     if (rc < 0 || counts[thread_id] > 5) 
      break; 

     server_name = FCGX_GetParam("SERVER_NAME", request.envp); 

     FCGX_FPrintF(request.out, 
        "Content-type: text/html\r\n" 
        "\r\n" 
        "<title>FastCGI Hello! (multi-threaded C, fcgiapp library)</title>" 
        "<h1>FastCGI Hello! (multi-threaded C, fcgiapp library)</h1>" 
        "Thread %d, Process %ld<p>" 
        "Request counts for %d threads running on host <i>%s</i><p><code>", 
        thread_id, pid, THREAD_COUNT, server_name ? server_name : "?"); 

     pthread_mutex_lock(&counts_mutex); 
     ++counts[thread_id]; 
     for (i = 0; i < THREAD_COUNT; i++) 
      FCGX_FPrintF(request.out, "%5d " , counts[i]); 
     pthread_mutex_unlock(&counts_mutex); 

     FCGX_Finish_r(&request); 
    } 

    return NULL; 
} 

int main (int argc, char **argv) 
{ 
    int i; 
    pthread_t id[THREAD_COUNT]; 
    FCGX_Init(); 

    for (i = 0; i < THREAD_COUNT; i++) 
     pthread_create(&id[i], NULL, handleFcgi, (void*) i); 

    pthread_join(id[0], NULL); 
    pthread_join(id[1], NULL); 

    return(0); 
} 

我已經設置線程5個請求後才能完成,現在因爲後來我前完成我會添加一些自定義邏輯,並且我想在完成一些請求後完全重啓線程。

我想在每次存在時產生一個線程,這可能嗎?

+0

你真的需要所有這些標題嗎?和:比C標頭更喜歡C++標頭(例如,而不是'stdio.h',使用'cstdio') –

+0

這些標頭用於稍後我要做的圖像處理,因爲我現在單線程版本工作正常,現在我隔離多線程代碼在這裏問。 – alex88

回答

1

簡短的回答是,如果你讓線程退出,你必須產生一個新的線程。一旦退出線程,就不能重新啓動線程,此時系統已經拆除線程。你只需要創建一個新的線程或保持原有的活着,直到你不需要它。

好的,基於你剛剛陳述的內容,你爲什麼不考慮使用線程池,比如boost :: threadpool。這將爲您節省以瘋狂的速度產生新線程的開銷,因爲這是相當昂貴的操作。

一個線程池基本上是一個線程池,操作系統已經坐在這個線程池中,可以用來進行工作。這樣,您永遠不需要創建新線程,也不必擔心管理線程,只需交給他們工作並獲得結果。

+0

對不起,重啓我意味着重生。我將編輯問題 – alex88

+1

+1 - 使用一個池和一些屏障/集合點表示任務完成。創建/開始/加入/終止是浪費,效率低下,難以管理,並且很糟糕。如果您有任何其他線程間通信或同步機制之前提及的教科書或頁面加入,請將其刻錄或刪除其書籤。 –