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); }
额外说明
- 原代码中printf字符串内的直接换行是不规范写法,改为
\n转义符可避免潜在编译问题; - M1 Mac上编译时需链接pthread库,命令为:
clang -o thread_test thread_test.c -lpthread。
内容的提问来源于stack exchange,提问作者Andy Berrios
相关产品推荐
相关产品推荐

