Mat*_*att 5 c multithreading mutex locking pthreads
我正在使用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);
}
}
Run Code Online (Sandbox Code Playgroud)
结构初始化一次如下:
myStruct* struc = malloc(sizeof(struc));
setupStruct(struc);
Run Code Online (Sandbox Code Playgroud)
但是,有时当两个线程同时调用一个例程时,两个调用trylock似乎都会阻塞.我假设这是因为它同时为两个线程打印"试图锁定",但是不打印互斥锁是否被锁定.我原来遇到这个问题pthread_mutex_lock所以尝试了非阻塞版本因为这个原因,但它似乎仍然阻止.
这并不总是会发生,但是当它发生时,它始终是对例程的前两次调用.如果前两个调用运行正常,那么后续调用也可以正常工作.
这有什么理由阻止吗?由于其他一些问题,我只是错误地察觉到这种阻塞吗?如果问题可能在其他地方,我可以发布我的代码的其他部分.
这条线错了:
myStruct* struc = malloc(sizeof(struc));
Run Code Online (Sandbox Code Playgroud)
它没有释放足够的内存,因此您可能会丢弃/重用您访问互斥锁的内存.使用sizeof(struc)分配内存的类型struc和类型struc是a myStruct*,所以你只需要分配足够的内存来保存一个指针(即只需4或8个字节)
你应该做
myStruct* struc = malloc(sizeof *struc);
Run Code Online (Sandbox Code Playgroud)
要么
myStruct* struc = malloc(sizeof(myStruct));
Run Code Online (Sandbox Code Playgroud)