c++正确使用互斥

c++ correct use of mutex

本文关键字:c++      更新时间:2023-10-16

我有一个多线程项目,我用--tool=helgrind运行了valgrind,它显示了一些错误。我在那里使用互斥,我在网上找到了如何使用它,你能告诉我怎么了吗?

#include <iostream>
#include <pthread.h>
#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<MAX_SESSIONS; 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类型大小错误的旧头文件进行编译,则可能会导致问题。

该错误表明互斥对象的初始化有问题。很难确定是什么,但要确保在正确的位置初始化它。

在Helgrind文档页面上,他们提到可能存在被抑制的误报。。。不知何故,您可能会遇到这些问题,因为从表面上看,您似乎并没有错误地使用pthread互斥。

下面是他们写的:

Helgrind的错误检查不起作用正确地在系统内部线程库本身(libpthread.so(,以及通常观察到大量(false(里面有错误。Valgrind抑制系统然后过滤这些出去,所以你不应该看到他们。

如果您看到任何比赛错误报告其中libpthread.so或ld.so是与最内部关联的对象堆栈框架,请提交错误报告在http://www.valgrind.org/.

他们还指出,您应该使用"受支持的Linux发行版"。。。他们没有提到这到底意味着什么,但如果你使用的是非Linux操作系统,这也可能导致一些"误报"。也许值得让开发团队看看他们对此有何看法。

调用pthread_mutex_lock时出现错误EINVAL意味着两件事之一。

The mutex was created with the protocol attribute having the value PTHREAD_PRIO_PROTECT and the calling thread's priority is higher than the mutex's current priority ceiling.

The value specified by mutex does not refer to an initialised mutex object.

第二个似乎更有可能。尝试用int error = pthread_mutex_init(&M_CREATE_SESSION_LOCK, NULL);初始化main函数中的互斥体,并检查是否存在错误,而不是像当前那样用宏初始化它。

相关文章:
  • 没有找到相关文章