我使用pthread_mutex_trylock
锁定在一个结构中的互斥体,它只能被称为访问/由单个线程在给定的时间进行修改。如果互斥锁已经锁定,我只是从例程返回而不是排队/阻塞。`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
有这个问题,所以尝试了非阻塞版本的原因,但它似乎仍然阻塞。
这并不总是会发生,但当它发生时,它始终会调用该例程的前两个。如果前两个调用运行良好,则后续调用也可以正常工作。
这有什么理由阻止?我是否错误地认识到由于其他问题而导致的阻塞?如果问题可能在别处,我可以发布我的代码的其他部分。
没有理由来阻止,AFAIK。其他地方可能有些问题。 – Mat 2012-04-21 09:53:00
什么叫setupStruct()?有没有机会召集一次以上? – 2012-04-21 10:10:00
在新线程启动之前,它肯定只调用一次。我认为如果出现问题,最有可能使用指针。这些看起来是否正确?我用'myStruct * struc = malloc(sizeof(struc));'分配结构。我会用这个信息更新这个问题。 – Matt 2012-04-21 10:32:30