为什么pthread_key_create中的EAGAIN会发生?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么pthread_key_create中的EAGAIN会发生?相关的知识,希望对你有一定的参考价值。

有时当我尝试使用pthread_key_create创建密钥时,我收到了EAGAIN错误代码。有可能确切地知道为什么吗?

文件说:

系统缺少创建另一个特定于线程的数据密钥所需的资源,或者会超出系统对每个进程的密钥总数限制[PTHREAD_KEYS_MAX]。

如何检查它是否是键的限制?可能是某种监控工具,用于检查系统中已打开的密钥数量以及仍可使用的密钥数量?

关于我们的代码的一个重要事项:我们使用fork()并运行多个进程。每个进程可以有多个线程。

我发现当我们使用fork()时,我们没有螺纹键的独立限制。这是一个小例子。

#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <unistd.h>

size_t create_keys(pthread_key_t *keys, size_t number_of_keys)
{
    size_t counter = 0;
    for (size_t i = 0; i < number_of_keys; i++)
    {
        int e = pthread_key_create(keys + i, NULL);
        if (e)
        {
            printf("ERROR (%d): index: %ld, pthread_key_create (%d)
", getpid(), i, e);
            break;
        }
        counter++;
    }

    return counter;
}

int main(int argc, char const *argv[])
{
    printf("maximim number of thread keys: %ld
", sysconf(_SC_THREAD_KEYS_MAX));

    printf("process id: %d
", getpid());

    const size_t number_of_keys = 1024;

    pthread_key_t keys_1[number_of_keys];
    memset(keys_1, 0, number_of_keys * sizeof(pthread_key_t));

    printf("INFO (%d): number of active keys: %ld
", getpid(), create_keys(keys_1, number_of_keys));

    pid_t p = fork();
    if (p == 0)
    {
        printf("process id: %d
", getpid());

        pthread_key_t keys_2[number_of_keys];
        memset(keys_2, 0, number_of_keys * sizeof(pthread_key_t));

        printf("INFO (%d): number of active keys: %ld
", getpid(), create_keys(keys_2, number_of_keys));
    }

    return 0;
}

当我在Ubuntu 16.04上运行这个例子时,如果我使用相同数量的键作为limit(1024),我看到子进程无法创建任何新的线程键。但是,如果我使用512个键进行父进程和子进程,我可以无误地运行它。

答案

最大值:

#include <unistd.h>
#include <stdio.h>

int main ()
{
  printf ("%ld
", sysconf(_SC_THREAD_KEYS_MAX));
  return 0;
}

考虑使用pthread_key_delete

以上是关于为什么pthread_key_create中的EAGAIN会发生?的主要内容,如果未能解决你的问题,请参考以下文章

pthread_key_t和pthread_key_create()详解

记一次pthread_key_create导致的__nptl_deallocate_tsd段错误

为什么EA在STP模式下能够获利?

ea画时序图怎么变成两条

UML建模—EA创建类图

没有通过蓝牙收到 EA 通知