我有一个服务器应用程序,它等待队列,获取传入消息,并生成一个线程来处理接收到的消息并发送答复。
我使用的p线程部分/选项如下:
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,这显然表明我的进程已经超过了最大线程阈值,这是基于我在互联网上看到的内容。
然而,
top和ps -p <PID> -lfT检查应用程序使用了多少线程,只有3个线程(一个用于主服务器,一个用于消息接收方,一个用于队列系统的消息发送方)。PS
“过程”原型如下:
class MessageProcessor
{
MessageProcessor();
static void * MessageProcessor::process(void * arg);
}
void * MessageProcessor::process(void * arg)
{
// do something here with arg
}发布于 2014-12-02 14:39:19
您的代码正在使用未初始化的child_attr,您必须这样做:
pthread_attr_init(&child_attr);
pthread_attr_setdetachstate(&child_attr, PTHREAD_CREATE_DETACHED);发布于 2014-12-01 23:59:45
与所有p线程函数一样,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是有效的时,才应该检查errno的值。
由于pthread_create没有文档化来设置errno,这意味着在调用pthread_create之后没有定义该值,因此不应该对其进行检查。
发布于 2014-12-01 21:53:58
errno 11通常是EAGAIN,在这种情况下,它意味着不再有可用的进程(linux将线程视为轻量级进程--参见克隆手册页)。
while(true)循环将永远运行创建进程。
注意,如果您有一个类似ARM的特殊版本的Linux,那么错误号11不需要是EAGAIN。所以用一点盐来回答这个问题。
https://stackoverflow.com/questions/27237760
复制相似问题