c语言中 锁的用法,c正确使用互斥锁

我有多线程项目,我通过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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值