当前位置: 首页 > 知识库问答 >
问题:

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

陆翔飞
2023-03-14

我试图让父进程在父进程继续之前等待多个子进程发出信号,使用未命名信号量数组(每个子进程一个信号量)。但是,当使用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()。

共有1个答案

傅丁雷
2023-03-14

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

父级的副本保持锁定。sem_trywait失败,导致eAgain,这将转换为资源暂时不可用解释。

 类似资料:
  • 问题内容: 什么会导致套接字命令出错?套接字设置为。它在大多数时间都有效,但偶尔会出现此错误。插槽的接收端似乎工作正常。 我知道这不是很详细,但我只是在寻找一般想法。谢谢! 问题答案: 是与相对应的错误消息,这意味着该操作将被阻止,但请求了非阻止操作。对于,这可能是由于以下原因之一: 显式地将文件描述符标记为非阻塞;要么 将旗帜传递给; 要么 使用套接字选项设置发送超时。

  • 我在C中使用tcp套接字服务器和客户端。使用AF_INET、SOCK_STREAM和IPPROTO_TCP 在sock send()命令上有一个可能导致“资源暂时不可用”的帖子,其中Davide Berra说 这是因为您使用的是非阻塞套接字,并且输出缓冲区已满。 从send()手册页

  • 我们有一个限制实现,基本上可以归结为: 我想收集关于信号量对方法的整体响应时间的影响的指标。例如,我想知道等待获取的线程数量,等待的时间等等。我想,我正在寻找的是一种也能捕捉时间信息的量规。 如何测量Semphore统计数据?

  • 问题内容: 我试图通过使用spring hibernatetemplate将我的hibernate示例移植到spring,但出现此错误,原因是:java.io.FileNotFoundException:无法打开ServletContext资源[/applicationContext.xml]。请建议我运行我的项目。我在公司里更新鲜 我的web.xml文件 我的applicationContext

  • 创建套接字 使其非阻塞 呼叫连接 按预期返回-1和errno EINPROGRESS 调用select 返回>0,因此已建立连接 再次阻塞套接字 此部件的代码如下: 那还行。但是我有一个循环,在这个循环中我调用了一个函数,该函数检查是否收到了要读取的新数据包:

  • 我有一个伪终端从机,它给我一个资源暂时不可用的读/写错误(11)。我一直无法解决这个问题,但直到一周前我还不知道任何事情。所以,我可能漏掉了一些明显的东西。 根据我所了解的情况,这可能是由对非阻塞PTY调用引起的。但是,当我检查从pty的I之后的时,该值显示它是一个阻塞文件描述符。 我甚至尝试将视为非阻塞文件,使用来确定它何时就绪。但是,它只是每次都超时。 那么,如果设置为blocking,为什么