我有一個服務器應用程序,它在隊列中等待,獲取傳入消息,併產生一個線程來處理收到的消息併發送答覆。是我使用pthread在分離的線程上創建錯誤11
的並行線程部分/選項如下:
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);
我每次運行它,顯示的錯誤代碼是,這顯然將表明我的過程已經越過了最大線程閾值,基於我在互聯網上閱讀的內容。
然而,
- 這是從一開始就發生的事情,而不是之後我已經運行了一段時間的應用程序。
- 線程創建爲分離的,所以我不應該使用pthread_join()。
- 我使用
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
}
由「顯示錯誤代碼」假設你實際上意味着「這是傳遞到過程中的信號」,信號11 SIGSEGV是,這是違反分段的情況,通常是由於指針使用不當造成的。如果11實際上是errno變量的報告值,那麼可能是EAGAIN,它通常表示暫時失敗,應該在稍後重試。 – twalberg 2014-12-01 21:54:12
@twalberg通過顯示的錯誤代碼,我的意思是在我的代碼中printf()中顯示的錯誤 - 這是'errno'。每分鐘接收一條消息10分鐘,直到發送有效的回覆,因此重試正在進行。但是,每次收到郵件時,錯誤始終爲11. – Sagar 2014-12-01 22:03:44
您是否有機會更改堆棧大小?你有很多線程本地存儲數據? EAGAIN表示資源短缺,而不是特定的資源。線程分配需要:新的進程/線程,堆棧的內存和TLS段的副本。 – Dummy00001 2014-12-01 22:11:10