繁体   English   中英

信号量未能等待,原因是“资源暂时不可用”

[英]Semaphores failing to wait, with reason “Resource temporarily unavailable”

我正在尝试让父进程在父进程继续之前等待多个子进程信号,使用一组未命名的信号量(每个子进程一个)。 但是,当使用sem_wait()时,父进程无限期地等待,而sem_trywait()返回“资源暂时不可用”错误,并且在子进程没有发出信号的情况下继续。 sem_init()和sem_post()都不会返回错误。

相关部分代码:

int numsems = concurrent_instrs.size();
std::cout << "Num sems: " << numsems << "\n";
// create semaphores
sem_t* sems = new sem_t[numsems];
for (int i = 0; i < numsems; i++)
{
    if (sem_init(&sems[i], 1, 0) < 0)
    {
        perror("sem initialization failed");
        exit(1);
    }
}

int child_num = 0;

// perform all calculations in block concurrently
for(unsigned int i = 0; i < concurrent_instrs.size() && !isChild; i++)
{
    int pid = fork();
    if (pid == -1)
    {
        perror("Error forking:");
        exit(1);
    }
    if (pid == 0)
    {
        isChild = true;
        instr = concurrent_instrs[i];
    }
    else
    {
        child_num++;
    }
}
if (isChild)
{
    std::cout << "Child process " << child_num << " calculating: " << instr << "\n";
    perform_calculation(instr, input_vars, internal_vars, shm_input, shm_internal);
    std::cout << "Child process " << child_num << " finished calculating\n";

    if (sem_post(&sems[child_num]) < 0)
    {
        perror("Child signal failed");
    }

    std::cout << "Child "<< child_num << " signalled\n";

    // detach from shared memory
    if (shmdt(shm_input) < 0)
    {
        perror("child shm_input detach failed");
    }
    if (shmdt(shm_internal) < 0)
    {
        perror("child shm_internal detach failed");
    }
    exit(0);
}
else
{
    // parent waits for all children to finish
    for (int i = 0; i < numsems; i++)
    {
        std::cout << "Waiting on subprocess " << i << " of " << numsems << "\n";
        if (sem_trywait(&sems[i]) < 0)
            perror("Parent wait failed");
        else
            std::cout << "Parent wait " << i << " working\n";
    }
    std::cout << "Finished waiting\n";

    // destroy semaphores
    for (int i = 0; i < numsems; i++)
    {
        if(sem_destroy(&sems[i]) < 0)
        {
            perror("Sem destroy failed");
            exit(2);
        }
        else
        {
            std::cout << "Sem " << i << " destroyed\n";
        }
    }

    delete[] sems;
}

我是否设置错误,或者只是误解了如何在这种情况下使用信号量?

编辑添加:sem_wait()遇到错误,无论子进程在等待之前或之后调用sem_post()。

sem_t* sems = new sem_t[numsems];分配的信号量sem_t* sems = new sem_t[numsems]; 不在共享内存中。 因此,每个进程都有自己的副本,并且在子进程中发布不会影响父进程。

父母的副本保持锁定状态。 sem_trywaitEAGAIN而失败,这转换为resource temporarily unavailable解释。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM