我有這個線程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個請求後才能完成,現在因爲後來我前完成我會添加一些自定義邏輯,並且我想在完成一些請求後完全重啓線程。
我想在每次存在時產生一個線程,這可能嗎?
你真的需要所有這些標題嗎?和:比C標頭更喜歡C++標頭(例如,而不是'stdio.h',使用'cstdio') –
這些標頭用於稍後我要做的圖像處理,因爲我現在單線程版本工作正常,現在我隔離多線程代碼在這裏問。 – alex88