调用pthread_create

时间:2019-04-09 21:40:38

标签: c linux pthreads valgrind

问题

当我使用以下代码创建分离的线程时,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);
}

1 个答案:

答案 0 :(得分:2)

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

函数receive_async每秒被调用几次。即使我正在创建分离的线程,Valgrind的虚拟环境运行的速度也比本地环境慢得多。因此,情况是我创建线程的速度比Valgrind销毁它们的速度快。 Valgrind对其可以使用的线程数施加了限制,默认限制为500。

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