创建线程时,有些线程ID为0

时间:2013-11-08 18:10:11

标签: c linux multithreading pthreads

我有一个服务器应用程序,可以为每个传入的请求创建新线程。

但是,每隔一段时间,它会创建一个线程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上。

1 个答案:

答案 0 :(得分:2)

你不能这样做:

while (1)
{
    // if incoming connection is valid
    data_ptr_t data;
    int error = pthread_create(&(data.tid), 
        NULL, (void * (*) (void *)) worker, (void *) &data);

你的data_ptr_t是堆栈上的局部变量。在while循环的下一次迭代中,该变量被销毁/消失/无效。

while循环可能会在新worker线程开始运行之前很久就开始另一次迭代,并使用传递给它的数据。相反,动态分配您传递给工作线程的data,这样您就可以确定它仍然有效。