我有一个服务器应用程序,它等待队列,获取传入的消息,并生成一个线程来处理收到的消息并发送回复。
我使用的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在互联网上阅读。
然而,
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
}
答案 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);