1

N個のスレッドを生成し、終了する前に終了するのを待つこのスレッド化されたfcgiアプリがあります

#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つのリクエストの後にスレッドを終了するように設定しました。

スレッドが存在するたびにスレッドを生成したいのですが、それは可能ですか?

4

1 に答える 1

1

簡単に言うと、スレッドを終了させた場合は、新しいスレッドを生成する必要があります。スレッドが終了すると、スレッドを再開することはできません。その時点で、システムはスレッドを破棄します。新しいスレッドを作成するか、必要がなくなるまで元のスレッドを存続させる必要があります。

さて、あなたが今述べたことに基づいて、boost::threadpoolのようなスレッドプールの使用を検討してみませんか。これにより、かなりコストのかかる操作であるため、新しいスレッドを狂った速度で生成するオーバーヘッドを節約できます。

スレッドプールは基本的に、OSが周りに座っているスレッドのプールであり、作業を行うために使用できます。このように、新しいスレッドを作成する必要はありません。スレッドの管理についてあまり心配する必要はありません。スレッドに作業を渡して結果を得るだけです。

于 2012-12-21T09:32:53.640 に答える