gpt4 book ai didi

c - `pthread_mutex_trylock` 两个线程同时调用时阻塞

转载 作者:太空狗 更新时间:2023-10-29 14:57:50 25 4
gpt4 key购买 nike

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

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

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

最佳答案

这一行是错误的:

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

它没有分配足够的内存,因此您可能在访问互斥锁时浪费/重复使用内存。使用 sizeof(struc)struc 的类型分配内存,而 struc 的类型是一个 myStruct* ,所以你只分配足够的内存来容纳一个指针(即可能只有 4 或 8 个字节)

你应该做的

    myStruct* struc = malloc(sizeof *struc); 

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

关于c - `pthread_mutex_trylock` 两个线程同时调用时阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10257873/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com