如何在C语言中使用Mutex实现多线程同步,保证线程1优先执行?
嘿,我明白你要实现的是一个严格按顺序执行的线程写入程序——先让线程1写完小写字母,再让线程2写大写字母到同一个文件里。你目前已经引入了互斥锁,但仅靠互斥锁只能保证同一时间只有一个线程操作文件,没法控制线程的执行顺序,所以得加额外的同步机制来确保线程1优先完成任务。
问题分析与完整解决方案
你的现有代码片段
/****************** * 头文件 ******************/ #include <stdio.h> #include <pthread.h> #include <string.h> #include <stdlib.h> #include <ctype.h> pthread_mutex_t lock; void* write_p1() { // 这里你的代码还未完善 if (...) { // 写入逻辑 } }
我们可以用条件变量+互斥锁+标志位的组合来实现严格的顺序控制:线程1完成写入后,通过条件变量通知线程2启动,既能保证文件操作的线程安全,又能完全满足“线程1必须先运行”的要求。
完整可运行代码
#include <stdio.h> #include <pthread.h> #include <string.h> #include <stdlib.h> // 同步工具:互斥锁保护共享资源,条件变量实现线程通知 pthread_mutex_t file_lock; pthread_cond_t finish_signal; // 标志位:标记线程1是否完成写入,避免虚假唤醒 int thread1_finished = 0; // 线程1:写入小写字母到文件 void* write_lowercase(void* arg) { FILE* target_file = (FILE*)arg; pthread_mutex_lock(&file_lock); // 写入小写字母a-z char lower_str[] = "abcdefghijklmnopqrstuvwxyz\n"; fwrite(lower_str, sizeof(char), strlen(lower_str), target_file); printf("线程1已完成小写字母写入\n"); // 更新状态并通知线程2可以开始 thread1_finished = 1; pthread_cond_signal(&finish_signal); pthread_mutex_unlock(&file_lock); pthread_exit(NULL); } // 线程2:写入大写字母到文件(必须等线程1完成) void* write_uppercase(void* arg) { FILE* target_file = (FILE*)arg; pthread_mutex_lock(&file_lock); // 循环等待线程1完成,避免虚假唤醒 while (!thread1_finished) { pthread_cond_wait(&finish_signal, &file_lock); } // 写入大写字母A-Z char upper_str[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ\n"; fwrite(upper_str, sizeof(char), strlen(upper_str), target_file); printf("线程2已完成大写字母写入\n"); pthread_mutex_unlock(&file_lock); pthread_exit(NULL); } int main() { FILE* fp = fopen("output.txt", "w"); if (fp == NULL) { perror("无法打开目标文件"); exit(EXIT_FAILURE); } // 初始化同步工具 pthread_mutex_init(&file_lock, NULL); pthread_cond_init(&finish_signal, NULL); pthread_t tid1, tid2; // 即使先创建线程2,它也会进入等待状态,不影响顺序 pthread_create(&tid1, NULL, write_lowercase, (void*)fp); pthread_create(&tid2, NULL, write_uppercase, (void*)fp); // 等待两个线程执行完毕 pthread_join(tid1, NULL); pthread_join(tid2, NULL); // 清理资源 pthread_mutex_destroy(&file_lock); pthread_cond_destroy(&finish_signal); fclose(fp); printf("所有写入任务完成!\n"); return 0; }
关键细节说明
- 条件变量
pthread_cond_t:实现线程间的通知机制,线程2会在这个变量上阻塞,直到线程1发出完成信号。 - 标志位+while循环:用
thread1_finished标记线程状态,同时用while循环检查,避免操作系统的虚假唤醒问题。 - 互斥锁的作用:既保护文件的读写操作不冲突,也保证标志位的修改是原子性的,避免同步逻辑出错。
- 编译运行:编译时需要链接pthread库,命令如下:
gcc -o thread_writer thread_writer.c -pthread ./thread_writer
运行后打开output.txt,会看到先输出小写字母,再输出大写字母,完全符合你的需求。
内容的提问来源于stack exchange,提问作者ABCDE
相关产品推荐
相关产品推荐

