You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux环境下C语言第二个线程函数不执行且程序阻塞问题排查

问题分析与修复

核心原因

两个线程函数中的互斥锁解锁操作被放在了return NULL;之后,导致锁永远无法释放:

  • 线程t1执行时,成功获取互斥锁,完成打印后直接return终止函数,解锁代码根本没机会运行;
  • 线程t2调用pthread_mutex_lock(&mutex)时,会一直等待t1释放锁,陷入永久阻塞,因此t2的逻辑完全不会执行;
  • 程序阻塞在pthread_join(t2, NULL)时,终端输入的按键会以转义序列(如^[[A)形式直接显示,因为没有程序逻辑处理输入。

修复后的代码

将解锁操作移到return语句之前,确保锁一定会被释放:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void* print_i(void *ptr)
{
    pthread_mutex_lock(&mutex);

    printf("1: I am\n");
    sleep(1);
    printf("in i\n");
    
    pthread_mutex_unlock(&mutex); // 移至return前,保证锁被释放
    return NULL;
}

void* print_j(void *ptr)
{
    pthread_mutex_lock(&mutex);

    printf("2: I am\n");
    sleep(1);
    printf("in j\n");
    
    pthread_mutex_unlock(&mutex); // 同样调整位置
    return NULL;
}

int main()
{
    pthread_t t1,t2;
    int rc1 = pthread_create(&t1, NULL, print_i, NULL);
    int rc2 = pthread_create(&t2, NULL, print_j, NULL);
    
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);

    exit(0);
}

额外说明

  1. 原代码中printf字符串内的直接换行是不规范写法,改为\n转义符可避免潜在编译问题;
  2. M1 Mac上编译时需链接pthread库,命令为:clang -o thread_test thread_test.c -lpthread。

内容的提问来源于stack exchange,提问作者Andy Berrios

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 16:32:24