pthread_create分离线程上的错误11

时间:2014-12-01 21:34:55

标签: c++ c linux multithreading pthreads

我有一个服务器应用程序,它等待队列,获取传入的消息,并生成一个线程来处理收到的消息并发送回复。

我使用的pthread部分/选项如下:

pthread_attr_t child_attr;
pthread_attr_setdetachstate(&child_attr, PTHREAD_CREATE);

// other code here

while (true)
{

    // code here to wait on valid message (msg)
    if (valid_message(msg))
    {
        pthread_t child_thread;
        MessageProcessor * processor = new MessageProcessor();
        if (0 == pthread_create(&child_thread, &child_attr, processor->process, (void *) msg))
        {
            printf("Thread dispatch successful\n");
        }
        else
        {
            printf("Error %d: could not create thread\n", errno);
        }
    }
}

// other code here
pthread_attr_destroy(&child_attr);

每次运行时,显示的错误代码都是 11 显然表示我的进程已超过最大线程阈值,基于I&#39在互联网上阅读。

然而,

  • 这是从一开始就发生的,而不是在我运行应用程序一段时间之后。
  • 线程是分离创建的,因此我不必使用pthread_join()。
  • 我使用top以及ps -p <PID> -lfT来检查应用程序正在使用多少个线程,只有3个(一个用于主服务器,一个用于消息接收器,一个用于a队列系统的消息发送者)

PS

&#34;流程&#34;原型如下:

class MessageProcessor
{
    MessageProcessor();
    static void * MessageProcessor::process(void * arg);
}

void * MessageProcessor::process(void * arg)
{
    // do something here with arg
}

3 个答案:

答案 0 :(得分:4)

与所有pthreads函数一样,pthread_create未设置errno报告错误,而是返回错误编号。要查看失败的原因,您需要打印返回值,而不是errno

const int err = pthread_create(&child_thread, &child_attr, processor->process, (void *) msg);

if (err == 0)
  printf("Thread dispatch successful\n");
else
  printf("Error %d: could not create thread\n", err);

POSIX指定errno,如下所示:

  

errno 的值只有在调用明确声明为其设置的函数后才能定义[...] errno 的值应该仅当函数的返回值表示有效时才进行检查。

由于未记录pthread_create来设置errno,因此意味着在调用pthread_create后未定义该值且不应检查该值。

答案 1 :(得分:1)

errno 11通常是EAGAIN,在这种情况下,它意味着没有更多的进程(linux将线程视为轻量级进程 - 请参阅克隆手册页)。

while(true)循环将永远运行进程。

请注意,如果您有像ARM这样的特殊版本的Linux,则错误编号11不需要是EAGAIN。所以请耐心等待这个答案。

答案 2 :(得分:1)

您的代码使用的是未初始化的child_attr,您必须这样做:

  pthread_attr_init(&child_attr); 
  pthread_attr_setdetachstate(&child_attr, PTHREAD_CREATE_DETACHED);