2012-04-21 40 views
5

我使用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有这个问题,所以尝试了非阻塞版本的原因,但它似乎仍然阻塞。

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

这有什么理由阻止?我是否错误地认识到由于其他问题而导致的阻塞?如果问题可能在别处,我可以发布我的代码的其他部分。

+1

没有理由来阻止,AFAIK。其他地方可能有些问题。 – Mat 2012-04-21 09:53:00

+1

什么叫setupStruct()?有没有机会召集一次以上? – 2012-04-21 10:10:00

+0

在新线程启动之前,它肯定只调用一次。我认为如果出现问题,最有可能使用指针。这些看起来是否正确?我用'myStruct * struc = malloc(sizeof(struc));'分配结构。我会用这个信息更新这个问题。 – Matt 2012-04-21 10:32:30

回答

8

此行是错误的:

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

它不alloate足够的内存,所以你可能捣毁/重用内存中访问互斥。使用sizeof(struc)struc类型分配内存,并struc类型为myStruct*,所以你只分配内存足以容纳一个指针(ielikely只是4或8个字节)

你应该做

myStruct* struc = malloc(sizeof *struc); 

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

哇,我一直在分配我的结构错误很长一段时间..感谢解释! – Matt 2012-04-21 12:06:55

0

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

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