Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c-pthreads:pthread_创建失败,错误代码为11(EAGAIN)_C_Linux_Pthreads - Fatal编程技术网

c-pthreads:pthread_创建失败,错误代码为11(EAGAIN)

c-pthreads:pthread_创建失败,错误代码为11(EAGAIN),c,linux,pthreads,C,Linux,Pthreads,我们有一个设置,其中我们正在录制视频SD卡连续使用我们的定制板。但从长远来看,我们面临着pthread\u create的问题 在尝试使用pthread_create生成线程时,我得到了一个EAGAIN。但是,从我检查的情况来看,线程似乎已经正确终止 未关闭的文件句柄是否可能是导致此EAGAIN的原因之一(即它们共享相同的资源空间) 我尝试使用属性PTHREAD\u CREATE\u DETACHED。这是我的代码片段 int alarm_main_loop(int qid, int audQi

我们有一个设置,其中我们正在录制视频SD卡连续使用我们的定制板。但从长远来看,我们面临着
pthread\u create
的问题

在尝试使用pthread_create生成线程时,我得到了一个
EAGAIN
。但是,从我检查的情况来看,线程似乎已经正确终止

未关闭的文件句柄是否可能是导致此
EAGAIN
的原因之一(即它们共享相同的资源空间)

我尝试使用属性
PTHREAD\u CREATE\u DETACHED
。这是我的代码片段

int alarm_main_loop(int qid, int audQid, SemHandl_t hAlarmSem)
{
    ALARM_MSG_BUF msgbuf;
    int msg_size, ret = 0;
    int event_index, sch_index;
    AlarmParam_t* pEvironment;
    pthread_t thread;
    pthread_attr_t attr;

    pAlarmSysInfo = GetSysInfo();
    if((hGIOSem = MakeSem()) == NULL) {
        return -1;
    }
    /* ADDED TO SEND SCHEDULE INFO TO SCHEDULE MANAGER */
    for (event_index = 0; event_index < MAX_NO_OF_EVENTS; event_index++) {
        for (sch_index = 0; sch_index < MAX_SCHEDULES; sch_index++) {
            Set_Event_Schedule(pAlarmSysInfo>event_details[event_index].event_schedule[sch_index], event_index, sch_index, 0);
        }
    }
    while(1)
    {
        /* Get Message */
        msg_size = msgrcv( qid, &msgbuf, sizeof(msgbuf) - sizeof(long), MSG_TYPE_MSG1, 0);
        if( msg_size < 0 ){
            printf("Alarm Receive msg fail \n");
            ret = -1;
            break;
        } else if(msgbuf.src == MSG_TYPE_MSG1 || msgbuf.src < 0){
            printf("Got Error message\n");
            ret = -1;
            break;
        } else if(msgbuf.event == ALARM_EVENT_QUIT){
            printf("Recieved Quit event\n");
            break;
        } else if(IsRestart()){
            // If already restart flag is set then ignore the messages
            continue;
        } else {
            /* Process alarm event */
            pEvironment =  (AlarmParam_t*)malloc(sizeof(AlarmParam_t));
            if(pEvironment == NULL){
                printf("Error: More memory need for Alarm server\n");
                break;
            }
            pEvironment -> msg_id    = qid;
            pEvironment -> audMsg_id = audQid;
            pEvironment->hAlarmSem   = hAlarmSem;
            memcpy(&pEvironment -> msg_buf, &msgbuf, sizeof(msgbuf));
            pthread_attr_init(&attr);
            pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); 
            if((ret = pthread_create(&thread, &attr, ProcAlarmThread,pEvironment)) != 0){
                free(pEvironment);
                printf("Error: Alarm server creat thread fail with error no %d\n", ret);
                break;
            }
            pthread_attr_destroy(&attr);
            pthread_detach(thread);
        }
    }
    DestroySem(hGIOSem);
    return ret;
}
int报警主回路(int qid、int audQid、SemHandl\t hAlarmSem)
{
报警信息(msgbuf);
int msg_size,ret=0;
int事件指数、sch指数;
报警参数*环境;
pthread\u t线程;
pthread_attr_t attr;
pAlarmSysInfo=GetSysInfo();
如果((hGIOSem=MakeSem())==NULL){
返回-1;
}
/*添加以将计划信息发送给计划管理器*/
对于(事件索引=0;事件索引<事件的最大数量;事件索引++){
对于(sch_指数=0;sch_指数Event\u details[Event\u index]。事件时间表[sch\u index],事件索引,sch\u index,0);
}
}
而(1)
{
/*得到消息*/
msg_size=msgrcv(qid和msgbuf,sizeof(msgbuf)-sizeof(long),msg_TYPE_MSG1,0);
如果(消息大小<0){
printf(“警报接收消息失败\n”);
ret=-1;
打破
}else if(msgbuf.src==MSG_TYPE_MSG1 | | msgbuf.src<0){
printf(“获取错误消息\n”);
ret=-1;
打破
}else if(msgbuf.event==报警事件退出){
printf(“接收退出事件”);
打破
}else if(IsRestart()){
//如果已设置重新启动标志,则忽略消息
继续;
}否则{
/*过程报警事件*/
pEnvironment=(AlarmParam_t*)malloc(sizeof(AlarmParam_t));
if(pEnvironment==NULL){
printf(“错误:报警服务器需要更多内存\n”);
打破
}
pEnvironment->msg_id=qid;
pEnvironment->audMsg\u id=audQid;
环境->hAlarmSem=hAlarmSem;
memcpy(&pEvironment->msg_buf,&msgbuf,sizeof(msgbuf));
pthread_attr_init(&attr);
pthread\u attr\u setdetachstate(&attr,pthread\u CREATE\u distached);
if((ret=pthread_create(&thread,&attr,ProcAlarmThread,pEnvironment))!=0){
免费(环境);
printf(“错误:报警服务器创建线程失败,错误号为%d\n”,ret);
打破
}
pthread_attr_destroy(&attr);
pthread_detach(线程);
}
}
扫描电镜(hGIOSem);
返回ret;
}
alarm\u main\u loop()
在线程内调用。此功能持续检查是否收到消息并采取相应措施

在连续运行近2天后,我们发现了这个问题

有人能告诉我这背后的原因吗

我们如何调试这个问题


我们尝试了
pthread\u join
而不是
pthread\u detach
(没有任何属性),但仍然遇到了相同的问题。

请包含显示问题的完整程序。请参考此处列出的指导原则。除了您的代码给出的图片非常有限外,我可能会假设您正面临在调用
pthread\u create
之前发生的另一个错误的干扰。原因-您的编码风格给人的印象是您没有测试错误。另一个提示是:EAGAIN-资源不足,无法创建另一个线程,或者遇到系统对线程数施加的限制。@我已经添加了完整的代码。我们正在函数中创建线程(函数是从线程调用的)。我们正在不断检查该函数是否接收到消息。基于此,线程是连续创建的。@dmi我修改了代码。我们使用“cat/proc/*/status | grep threads”检查了发布时的线程数。只有120左右。