alexleel 2023-11-20 17:30 采纳率: 0%
浏览 32
已结题

PTHREAD_MUTEX_RECURSIVE_NP 制造segment fault场景,chatgpt复制粘贴求别来

想要复现一个core dump 的场景,pthread_mutex_lock/pthread_mutex_unlock 时, mutex的类型是 PTHREAD_MUTEX_RECURSIVE, 在什么情况下会因为assert (mutex->__data.__owner == 0); 而产生core dump? 我想写一个简单的小程序来复现他 但是没有成功。

  • 写回答

16条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-11-20 18:51
    关注

    引自强大而免费的微信小程序:皆我百晓生

    在使用 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 或其他调试器以查看核心转储。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月27日
  • 修改了问题 11月21日
  • 赞助了问题酬金50元 11月20日
  • 创建了问题 11月20日

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度