5

我正在使用pthread_mutex_trylock将互斥锁锁定在结构上,以便在给定时间只能由单个线程访问/修改。如果互斥锁已经被锁定,我只是从例程返回而不是排队/阻塞。

这是我的代码的基本大纲:

typedef struct {
    pthread_mutex_t m;
} myStruct;

void setupStruct(myStruct* struc) {
    pthread_mutex_init(&struc->m, NULL);
}

void structOp(myStruct* struc) {

    printf("structOp(): Trying to lock\n");

    if(pthread_mutex_trylock(&struc->m) != 0) {
        printf("structOp(): Lock failed\n");
        return;
    } else {
        printf("structOp(): Locked\n");
        // do some stuff to struct
        pthread_mutex_unlock(&struc->m);
    }
}

该结构被初始化一次,如下所示:

myStruct* struc = malloc(sizeof(struc));
setupStruct(struc);

但是,有时当两个线程同时调用一个例程时,这两个调用trylock似乎都阻塞了。我假设这是因为它同时为两个线程打印“尝试锁定”,但不打印互斥锁是否被锁定。由于这个原因,我最初遇到了这个问题,pthread_mutex_lock所以尝试了非阻塞版本,但它似乎仍然阻塞。

这并不总是发生,但当它发生时,它总是对例程的前两次调用。如果前两个调用运行良好,那么后续调用也运行良好。

有什么理由会阻止吗?由于其他问题,我是否只是错误地感知到了这种阻塞?如果问题可能出在其他地方,我可以发布我的代码的其他部分。

4

2 回答 2

8

这一行是错误的:

    myStruct* struc = malloc(sizeof(struc)); 

它没有分配足够的内存,因此您可能正在丢弃/重用访问互斥锁的内存。usingsizeof(struc)为 of 的类型分配内存,而 ofstruc的类型struc为 a myStruct*,因此您分配的内存仅足以容纳一个指针(即可能只有 4 或 8 个字节)

你应该做

    myStruct* struc = malloc(sizeof *struc); 

或者

    myStruct* struc = malloc(sizeof(myStruct)); 
于 2012-04-21T11:00:49.073 回答
0

这是某种时间问题或内存损坏。无论哪种方式,它都与您发布的代码无关,因此无法回答这个问题。

如果您的操作系统支持 valgrind,请使用memcheckhelgrind模块检查您的应用程序。

于 2012-04-21T10:40:43.857 回答