当我使用以下代码创建分离的线程时,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);
}
答案 0 :(得分:2)
事实证明这是bug in Valgrind。应该真正报告的错误是EAGAIN。
函数receive_async
每秒被调用几次。即使我正在创建分离的线程,Valgrind的虚拟环境运行的速度也比本地环境慢得多。因此,情况是我创建线程的速度比Valgrind销毁它们的速度快。 Valgrind对其可以使用的线程数施加了限制,默认限制为500。
我能够使用命令watch ps -o nlwp <pid>
监视我的应用程序正在使用的线程数。在Valgrind中运行它时,线程数一直在增长,最多为500。在Valgrind之外运行时,该数更为合理(大约4个),并且不会无限期地增长。