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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:01:28