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

时间:2012-04-21 09:45:48

标签: c multithreading locking pthreads mutex

我正在使用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遇到了这个问题,所以为此我尝试了非阻塞版本,但它仍然似乎阻止了。

这并不总是会发生,但是当它发生时,它始终是前两个调用例程。如果前两个调用运行正常,那么后续调用也可以正常工作。

这会阻止任何原因吗?由于其他一些问题,我只是错误地察觉到这种阻塞吗?如果问题可能出在其他地方,我可以发布我的代码的其他部分。

2 个答案:

答案 0 :(得分:8)

这一行错了:

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

它没有释放足够的内存,因此您可能正在丢弃/重用访问互斥锁的内存。使用sizeof(struc)struc类型分配内存,struc的类型为myStruct*,因此您只需分配足够的内存来保存指针(即只需4或8个字节)

你应该做

    myStruct* struc = malloc(sizeof *struc); 

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

答案 1 :(得分:0)

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

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