我有多线程项目,我通过valgrind使用–tool = helgrind运行它,它显示我几个错误.我正在使用互斥量,但我如何在网上找到如何使用它,你能告诉我什么是错的吗?
#include
#include
#define MAX_THREADS 100
#define MAX_SESSIONS 100
static pthread_mutex_t M_CREATE_SESSION_LOCK= PTHREAD_MUTEX_INITIALIZER;
.....
void connection::proccess(threadVarsType &THREAD) {
....
pthread_mutex_lock(&M_CREATE_SESSION_LOCK);
unsigned int ii;
for (ii=0; ii
if (SESSION[ii]==NULL) {
break;
}
}
if (ii==MAX_SESSIONS-1) {
....
pthread_mutex_unlock(&M_CREATE_SESSION_LOCK); // unlock session mutex
....
return;
} else {
....
pthread_mutex_unlock(&M_CREATE_SESSION_LOCK); // unlock session mutex
....
}
....
}
和错误消息:
==4985== Thread #1's call to pthread_mutex_lock failed
==4985== with error code 22 (EINVAL: Invalid argument)
....
==4985== Thread #1 unlocked an invalid lock at 0x4E7B40
==4985== at 0x32CD8: pthread_mutex_unlock (hg_intercepts.c:610)
....
==4985== Thread #1's call to pthread_mutex_unlock failed
==4985== with error code 22 (EINVAL: Invalid argument)
....
==4985== Thread #1's call to pthread_mutex_lock failed
==4985== with error code 22 (EINVAL: Invalid argument)
....
==4985== Thread #1 unlocked an invalid lock at 0x4E7B40
==4985== at 0x32CD8: pthread_mutex_unlock (hg_intercepts.c:610)
....
==4985== Thread #1's call to pthread_mutex_unlock failed
==4985== with error code 22 (EINVAL: Invalid argument)
解决方法:
首先,始终检查函数调用的返回值.如果pthread调用失败,那么只调用abort()会是一个很好的选择,如果你已经启用了核心转储,那么它会进行核心转储,如果你正在运行调试器,则调入它.
pthread函数调用真的应该永远不会失败,这意味着你的程序出现严重错误.在C或C程序中,通常会导致神秘故障的是内存损坏.在正常模式下使用valgrind来检查它.
另一个可能导致pthread调用失败的事情是不使用-pthread进行编译.如果使用GCC,则应使用gcc编译和链接gcc -pthread等命令.这将链接pthread库,它将设置一些预处理器定义,这些定义可能对系统的头文件很重要.
有些系统会成功编译和链接使用pthread调用的程序,而不会将其链接到pthread库.这样做是为了使程序或库可以成为线程安全的,而无需实际使用线程.除非链接了真正的pthread库,否则线程调用将链接到虚函数.这可能导致某些函数调用失败.
因此,请确保使用正确的编译器选项构建以包含pthread库.
另一个可能的原因是,如果你正在建立一些糟糕的半混合操作系统,它从Linux 2.4开始,并在某个时候升级到Linux 2.6 NPTL(我曾经做过类似的事情).如果您尝试使用过时的PTHREAD_MUTEX_INITIALIZER定义或pthread_mutex_t类型的错误大小来编译旧头文件,那么可能会导致问题.
标签:c,pthreads,mutex
来源: https://codeday.me/bug/20190726/1543207.html