`pthread_mutex_trylock`当两个线程同时调用时会阻塞

`pthread_mutex_trylock`当两个线程同时调用时会阻塞,c,multithreading,locking,pthreads,mutex,C,Multithreading,Locking,Pthreads,Mutex,我正在使用pthread\u mutex\u trylock锁定结构上的互斥体,以便在给定时间只能由单个线程访问/修改它。如果互斥锁已经被锁定,我只是从例程返回,而不是排队/阻塞 这是我的代码的基本概要: typedef struct { pthread_mutex_t m; } myStruct; void setupStruct(myStruct* struc) { pthread_mutex_init(&struc->m, NULL); } void st

我正在使用
pthread\u mutex\u 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\u mutex\u lock
上遇到这个问题,因此尝试了非阻塞版本,但它似乎仍然阻塞

这并不总是发生,但当它发生时,总是对例程的前两个调用。如果前两个调用运行正常,则后续调用也可以正常运行


这有什么原因会阻碍吗?我只是因为其他问题而错误地理解了这种阻塞吗?如果问题可能出在其他地方,我可以发布代码的其他部分。

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

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

此行错误:

    myStruct* struc = malloc(sizeof(struc)); 
它没有分配足够的内存,因此您可能正在破坏/重用访问互斥的内存。使用
sizeof(struc)
struc
类型分配内存,而
struc
类型是
myStruct*
,因此您只分配足够容纳指针的内存(即可能只有4或8个字节)

你应该这样做

    myStruct* struc = malloc(sizeof *struc); 


没有理由阻止这件事,阿福。其他地方可能有问题。什么调用setupStruct()?它不会被多次调用,是吗?它肯定只被调用过一次,就在新线程开始之前。我想如果有问题的话,很可能是我使用了指针。这些似乎正确吗?我使用
myStruct*struc=malloc(sizeof(struc))分配结构。我将用这个信息更新这个问题。myStruct*struc=malloc(sizeof(myStruct));//不是struc-struc是指针!哇,很长一段时间以来,我一直在错误地分配结构。。谢谢你的解释!
    myStruct* struc = malloc(sizeof(myStruct));