如何在调用pthread_create时修复偶尔的EINVAL错误

问题描述 投票:1回答:1

问题

当我使用下面的代码创建一个分离的线程时,pthread_create有时会返回EINVAL。我想知道为什么会发生这种情况以及我应该采取哪些措施来解决这个问题。发生错误时,下面的代码将打印以下行:

创建线程时出错。 errno = 22:参数无效

我试过的

我在valgrind中运行代码时只观察到了这个问题。即便如此,它有时只会产生这种错误。因此,我倾向于认为时机是一个因素。我不认为我有竞争条件,因为此功能不依赖于任何共享数据。也许我对如何使用堆栈有疑问?我没有成功地从手册页中发现任何有用的线索,除了EINVAL意味着“attr'中的设置无效。”

我在Ubuntu 14.04上运行我的应用程序。

代码

/**
 * Creates a detached thread to receive data from the socket referred to by
 * sockfd.
 */
void recieve_async(int sockfd) {
    pthread_t receive_thread;
    pthread_attr_t attr;
    int error = pthread_attr_init(&attr);
    if (error != 0) {
        printf("attr_init failed. errno = %d: %s\n", error, strerror(error));
    }
    error = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
    if (error != 0) {
        printf("attr_setdetachstate failed. errno = %d: %s\n", error,
               strerror(error));
    }
    error = pthread_create(&receive_thread, &attr, receive, (void *)sockfd);
    if (error != 0) {
        printf("Error creating thread. errno = %d: %s\n", error,
               strerror(error));
        exit(1);
    }
    pthread_attr_destroy(&attr);
}
c linux pthreads valgrind
1个回答
2
投票

事实证明这是一个bug in Valgrind。应该真正报告的错误是EAGAIN。

函数receive_async每秒被调用几次。即使我正在创建分离线程,Valgrind的虚拟环境运行速度远远低于本机环境。所以情况是我创建的线程比Valgrind可以摧毁它们更快。 Valgrind对可以使用的线程数量施加限制,默认限制为500。

我能够使用命令watch ps -o nlwp <pid>监视我的应用程序使用的线程数。在Valgrind中运行它时,线程数量一直在增长,最多可达500个。当在Valgrind之外运行时,这个数字更合理(大约4)并且不会无限增长。

© www.soinside.com 2019 - 2024. All rights reserved.