1

着信要求ごとに新しいスレッドを作成するサーバー アプリケーションがあります。

ただし、ときどき、スレッド ID = 0 のスレッドが作成されます (これを確認するには pthread_equal を使用します)。pthread_create で指定された関数に渡すスレッド ID を含む構造体があり、そこでこれをチェックしています。

ID = 0 でスレッドが作成されるのはなぜですか? このような場合、何かできることはありますか?このスレッドは使用できません。すぐに終了したいと思います。

================================================== ===================

typedef struct 
{
    pthread_t tid;
    other_struct_t Other;
} data_ptr_t;

void * worker(void * arg)
{
    data_ptr_t local_data;
    data_ptr_t * incoming_data = (data_ptr_t *) arg;
    if (NULL == incoming_data || NULL == incoming_data->Other)
    {
        printf("invalid input\n");
    }
    else if (pthread_equal(incoming_data->tid, 0))
    {
        printf("invalid thread id\n");
    }
    else
    {
        // add to global thread pool
        // do other stuff here
        // remove from global thread pool
    }
}

int main()
{
    // server socket stuff
    while (1)
    {
        // if incoming connection is valid
        data_ptr_t data;
        int error = pthread_create(&(data.tid), NULL, (void * (*) (void *)) worker, (void *) &data);
        if (0 != errror)
        {
            printf("could not create thread (%d)\n", error);
        }
        else
        {
            pthread_detach(data.tid);
            printf("thread dispatched\n");
        }
    }
}

注:作成しているスレッドの数が 50 程度以下であれば、問題なく動作します。70 を超えると、ほとんどのスレッドは正常に処理され、残りは「無効なスレッド ID」が出力されます。

注:これは Linux 上にあります。

4

1 に答える 1