"华清 io进程线程 8月22 day6 作业"
这篇作业主要探讨了在多线程编程中如何使用互斥锁(Mutex)来实现线程同步和资源安全共享。互斥锁是多线程编程中一个重要的同步机制,它确保同一时间只有一个线程可以访问临界区,从而避免数据竞争(Race Condition)。
在提供的代码中,我们看到一个全局互斥锁`pthread_mutex_t mutex`被定义,用于保护共享变量`money`。`money`代表可用金额,两个线程`task1`和`task2`分别模拟了两个不同的任务,它们尝试从中取款。这两个线程都是无限循环,每个循环周期都包含以下步骤:
1. 使用`sleep(2)`函数让线程暂停一段时间,模拟了线程执行的异步性。
2. 调用`pthread_mutex_lock(&mutex)`对互斥锁进行上锁操作。当一个线程获得了锁,其他试图获取该锁的线程将被阻塞,直到持有锁的线程释放锁。
3. 检查`money`是否足够取款。如果`money`小于等于0,线程会释放锁并退出循环。
4. 执行取款操作,即减去相应金额。
5. 完成取款后,使用`pthread_mutex_unlock(&mutex)`释放互斥锁,允许其他等待锁的线程继续执行。
6. 最后,线程通过`pthread_exit(NULL)`退出。
在主函数`main`中,互斥锁被初始化`pthread_mutex_init(&mutex, NULL)`,然后创建了两个线程`tid1`和`tid2`,分别执行`task1`和`task2`。`pthread_create`函数用于创建线程,`pthread_join`函数则用于等待线程结束,确保主线程不会在子线程执行完毕之前结束。
这段代码展示了如何在C语言中使用POSIX线程库(pthread)进行多线程编程,以及如何通过互斥锁实现线程间的同步。在实际应用中,互斥锁通常用于保护共享资源,确保并发访问时的正确性和一致性。但需要注意的是,过度使用互斥锁可能导致死锁(Deadlock)和饥饿(Starvation)问题,因此在设计多线程程序时需要谨慎使用,并合理设计锁的粒度。