首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在分离的线程上创建错误11

在分离的线程上创建错误11
EN

Stack Overflow用户
提问于 2014-12-01 21:34:54
回答 3查看 2.9K关注 0票数 0

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

我使用的p线程部分/选项如下:

代码语言:javascript
复制
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,这显然表明我的进程已经超过了最大线程阈值,这是基于我在互联网上看到的内容。

然而,

  • 这是从一开始就发生的,而不是在我运行应用程序一段时间之后。
  • 线程是独立创建的,所以我不应该使用pthread_join()。
  • 我使用topps -p <PID> -lfT检查应用程序使用了多少线程,只有3个线程(一个用于主服务器,一个用于消息接收方,一个用于队列系统的消息发送方)。

PS

“过程”原型如下:

代码语言:javascript
复制
class MessageProcessor
{
    MessageProcessor();
    static void * MessageProcessor::process(void * arg);
}

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

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-02 14:39:19

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

代码语言:javascript
复制
  pthread_attr_init(&child_attr); 
  pthread_attr_setdetachstate(&child_attr, PTHREAD_CREATE_DETACHED);
票数 1
EN

Stack Overflow用户

发布于 2014-12-01 23:59:45

与所有p线程函数一样,pthread_create不将errno设置为报告错误,而是返回一个错误号。要了解失败的原因,需要打印返回值,而不是errno

代码语言:javascript
复制
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是有效的时,才应该检查errno的值。

由于pthread_create没有文档化来设置errno,这意味着在调用pthread_create之后没有定义该值,因此不应该对其进行检查。

票数 4
EN

Stack Overflow用户

发布于 2014-12-01 21:53:58

errno 11通常是EAGAIN,在这种情况下,它意味着不再有可用的进程(linux将线程视为轻量级进程--参见克隆手册页)。

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

注意,如果您有一个类似ARM的特殊版本的Linux,那么错误号11不需要是EAGAIN。所以用一点盐来回答这个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27237760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档