想要复现一个core dump 的场景,pthread_mutex_lock/pthread_mutex_unlock 时, mutex的类型是 PTHREAD_MUTEX_RECURSIVE, 在什么情况下会因为assert (mutex->__data.__owner == 0); 而产生core dump? 我想写一个简单的小程序来复现他 但是没有成功。
16条回答 默认 最新
关注 引自强大而免费的微信小程序:皆我百晓生。
在使用 PTHREAD_MUTEX_RECURSIVE 类型的互斥量时,通过多次调用 pthread_mutex_lock() 可以多次锁定同一互斥量,而不会导致死锁。然而,如果在不同的线程中出现多次调用 pthread_mutex_lock(),在未释放锁之前再次尝试加锁,就会产生死锁情况。在这种情况下,由于 assert (mutex->__data.__owner == 0); 的条件未满足,程序会产生核心转储并终止。
以下是一个简单的示例程序,演示了如何在使用 PTHREAD_MUTEX_RECURSIVE 互斥量时触发核心转储:
#include <stdio.h> #include <pthread.h> pthread_mutex_t mutex; void* worker(void* arg) { pthread_mutex_lock(&mutex); printf("Locked the mutex\n"); // 尝试再次加锁,导致死锁 pthread_mutex_lock(&mutex); printf("This line will never be reached\n"); pthread_mutex_unlock(&mutex); return NULL; } int main() { pthread_t tid; pthread_mutex_init(&mutex, NULL); // 创建子线程 pthread_create(&tid, NULL, worker, NULL); pthread_join(tid, NULL); pthread_mutex_destroy(&mutex); return 0; }
在此示例中,主线程创建一个子线程,子线程在加锁的情况下尝试再次加锁,导致死锁。因为 PTHREAD_MUTEX_RECURSIVE 类型的互斥量允许多次锁定,所以在加锁时不会发生阻塞,而是继续执行直到核心转储发生。
编译并运行此程序,应该触发核心转储并在控制台上显示相应的错误信息。请确保在编译时启用调试信息和核心转储,以便正确设置 gdb 或其他调试器以查看核心转储。
解决 1无用
悬赏问题
- ¥100 set_link_state
- ¥15 虚幻5 UE美术毛发渲染
- ¥15 CVRP 图论 物流运输优化
- ¥15 Tableau online 嵌入ppt失败
- ¥100 支付宝网页转账系统不识别账号
- ¥15 基于单片机的靶位控制系统
- ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
- ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
- ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
- ¥15 手机接入宽带网线,如何释放宽带全部速度