使用互斥锁同步多线程打印

CCBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个项目中,你将学习如何使用互斥锁(mutex)在多线程环境中同步字符串的打印。你将修改现有的「混乱打字机」程序,以确保字符串按正确顺序打印,且字母不会相互混淆。

👀 预览

$ gcc printer.c -o printer -lpthread
$./printer
helloworld

🎯 任务

在这个项目中,你将学习:

  • 如何在 init() 函数中初始化互斥锁
  • 如何在 printer() 函数中锁定和解锁互斥锁,以确保对打印过程的独占访问
  • 如何编译和运行修改后的程序,以观察正确的输出

🏆 成果

完成这个项目后,你将能够:

  • 理解互斥锁在多线程程序中同步对共享资源的访问的重要性
  • 应用互斥锁锁定和解锁技术来协调多个线程的执行
  • 排查和修复多线程程序中的问题,以获得期望的输出

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("`C`")) -.-> c/CompoundTypesGroup(["`Compound Types`"]) c(("`C`")) -.-> c/PointersandMemoryGroup(["`Pointers and Memory`"]) c(("`C`")) -.-> c/FunctionsGroup(["`Functions`"]) c(("`C`")) -.-> c/UserInteractionGroup(["`User Interaction`"]) c/CompoundTypesGroup -.-> c/strings("`Strings`") c/PointersandMemoryGroup -.-> c/memory_address("`Memory Address`") c/FunctionsGroup -.-> c/function_declaration("`Function Declaration`") c/FunctionsGroup -.-> c/function_parameters("`Function Parameters`") c/UserInteractionGroup -.-> c/output("`Output`") subgraph Lab Skills c/strings -.-> lab-301495{{"`使用互斥锁同步多线程打印`"}} c/memory_address -.-> lab-301495{{"`使用互斥锁同步多线程打印`"}} c/function_declaration -.-> lab-301495{{"`使用互斥锁同步多线程打印`"}} c/function_parameters -.-> lab-301495{{"`使用互斥锁同步多线程打印`"}} c/output -.-> lab-301495{{"`使用互斥锁同步多线程打印`"}} end

初始化互斥锁

在这一步中,你将学习如何在 init() 函数中初始化互斥锁。请按照以下步骤完成此步骤:

  1. 打开位于 /home/labex/project/ 目录下的 printer.c 文件。
  2. 在已经给出的 printer 函数代码中,互斥锁在开始时被锁定(pthread_mutex_lock(&mutex)),以确保对打印过程的独占访问。一旦字符串完全打印完毕,互斥锁就会被解锁(pthread_mutex_unlock(&mutex)),允许其他线程进行打印。
  3. 找到 init() 函数,并添加以下代码来初始化互斥锁:
void init()
{
    pthread_mutex_init(&mutex, NULL);
}

这使用 pthread_mutex_init() 函数初始化 mutex 变量,该函数是 POSIX 线程(pthreads)库的一部分。第二个参数 NULL 表示我们正在使用默认的互斥锁属性。

编译并运行程序

既然你已经完成了对 printer.c 文件的修改,就可以编译并运行该程序了。

  1. 打开一个终端,导航到 /home/labex/project/ 目录。
  2. 使用 -lpthread 标志编译程序,以链接 pthreads 库:
gcc printer.c -o printer -lpthread
  1. 运行程序:
./printer

现在你应该会看到输出:

helloworld

正如预期的那样,字符串 “hello” 和 “world” 按顺序打印,字母没有任何混淆。

恭喜你!你已成功修改「混乱打字机」程序,使其按预期工作。

✨ 查看解决方案并练习

总结

恭喜你!你已经完成了这个项目。你可以在 LabEx 中练习更多实验来提升你的技能。

您可能感兴趣的其他 C 教程