4

現在、ApachePortableRuntimeを使用してスレッドを実装しようとしています。ドキュメントや例が不足しているため、意図したとおりに実行しているかどうかがよくわからない場合を除いて、すべて正常に動作します。

サーバーと場合によってはスレッドをクリーンアップするために、コンソールでCTRL-Cをキャッチするために、2つのスレッドとシグナル処理が必要です。これが私の現在のアプローチです。

// Define APR thread pool
apr_pool_t *pool;

// Define server
MyServer *server;

// Define threads
apr_thread_t *a_thread, *b_thread;
apr_status_t status;

static void * APR_THREAD_FUNC func_a(apr_thread_t * thread,
        void *data) {
        // do func_a stuff here
}

static void * APR_THREAD_FUNC func_b(apr_thread_t * thread,
        void *data) {
        // do func_b stuff here
}

// Cleanup before exit
void cleanup(int s) {
    printf("Caught signal %d\n", s);

    // Destroy thread pool
    apr_pool_destroy(pool);

    //apr_thread_exit(a_thread, APR_SUCCESS);
    //apr_thread_exit(b_thread, APR_SUCCESS);

    //apr_terminate();

    // Stop server and cleanup
    server->stopServer();
    delete server;

    exit(EXIT_SUCCESS);
}

int main(void) {
    // Signal handling
    signal(SIGINT, cleanup);

    // Create server
server = MyServerFactory::getServerImpl();

bool success = server->startServer();

// Initialize APR
if (apr_initialize() != APR_SUCCESS) {
    printf("Could not initialize\n");
    return EXIT_FAILURE;
}

// Create thread pool
if (apr_pool_create(&pool, NULL) != APR_SUCCESS) {
    printf("Could not allocate pool\n");
    return EXIT_FAILURE;
}

// Create a_thread thread
if (apr_thread_create(&a_thread, NULL, func_a, NULL,
        pool) != APR_SUCCESS) {
    printf("Could not create a_thread\n");
    return EXIT_FAILURE;
}

//Create b_thread thread
if (apr_thread_create(&b_thread, NULL, func_b, NULL,
        pool) != APR_SUCCESS) {
    printf("Could not create b_thread\n");
    return EXIT_FAILURE;
}

    // Join APR threads
    apr_thread_join(&status, a_thread);
    apr_thread_join(&status, b_thread);

    return EXIT_SUCCESS;
}

これは多かれ少なかれ期待どおりに機能します。私が本当によくわからない唯一のことは、クリーンアップがうまく機能するかどうかです。

  1. クリーンアップ関数が複数回呼び出されているようです(文字列「Caughtsignal ..」が端末に複数回表示されます)。これを防ぐ方法はありますか?これは問題がありますか?

  2. 使用後にAPRスレッドをクリーンアップするための例が複数見つかりました。私のやり方は十分ですか、それともコメントされたものが必要ですか?それとも私は完全に間違っていますか?

4

1 に答える 1