介绍
在这个项目中,你将学习如何使用互斥锁(mutex)在多线程环境中同步字符串的打印。你将修改现有的「混乱打字机」程序,以确保字符串按正确顺序打印,且字母不会相互混淆。
👀 预览
$ gcc printer.c -o printer -lpthread
$./printer
helloworld
🎯 任务
在这个项目中,你将学习:
- 如何在
init()函数中初始化互斥锁 - 如何在
printer()函数中锁定和解锁互斥锁,以确保对打印过程的独占访问 - 如何编译和运行修改后的程序,以观察正确的输出
🏆 成果
完成这个项目后,你将能够:
- 理解互斥锁在多线程程序中同步对共享资源的访问的重要性
- 应用互斥锁锁定和解锁技术来协调多个线程的执行
- 排查和修复多线程程序中的问题,以获得期望的输出
初始化互斥锁
在这一步中,你将学习如何在 init() 函数中初始化互斥锁。请按照以下步骤完成此步骤:
- 打开位于
/home/labex/project/目录下的printer.c文件。 - 在已经给出的
printer函数代码中,互斥锁在开始时被锁定(pthread_mutex_lock(&mutex)),以确保对打印过程的独占访问。一旦字符串完全打印完毕,互斥锁就会被解锁(pthread_mutex_unlock(&mutex)),允许其他线程进行打印。 - 找到
init()函数,并添加以下代码来初始化互斥锁:
void init()
{
pthread_mutex_init(&mutex, NULL);
}
这使用 pthread_mutex_init() 函数初始化 mutex 变量,该函数是 POSIX 线程(pthreads)库的一部分。第二个参数 NULL 表示我们正在使用默认的互斥锁属性。
编译并运行程序
既然你已经完成了对 printer.c 文件的修改,就可以编译并运行该程序了。
- 打开一个终端,导航到
/home/labex/project/目录。 - 使用
-lpthread标志编译程序,以链接 pthreads 库:
gcc printer.c -o printer -lpthread
- 运行程序:
./printer
现在你应该会看到输出:
helloworld
正如预期的那样,字符串“hello”和“world”按顺序打印,字母没有任何混淆。
恭喜你!你已成功修改「混乱打字机」程序,使其按预期工作。
总结
恭喜你!你已经完成了这个项目。你可以在 LabEx 中练习更多实验来提升你的技能。



