7.19作业
第一题:测试错误检查锁和递归锁是否能避免死锁。
错误检查锁避免死锁:
如果一个线程尝试获取它自己已经持有的锁,
pthread_mutex_lock
将不会阻塞,而是返回错误EDEADLK
。#include <pthread.h> #include <stdio.h> #include <errno.h>pthread_mutex_t error_check_lock = PTHREAD_MUTEX_INITIALIZER;void *try_locking_thread(void *arg) {int ret;ret = pthread_mutex_lock(&error_check_lock);if (ret == 0) {printf("Lock acquired\n");pthread_mutex_unlock(&error_check_lock);} else if (ret == EDEADLK) {printf("Deadlock detected, error: %d\n", ret);} else {printf("Other error: %d\n", ret);}return NULL; }int main() {pthread_t thread1, thread2;pthread_mutex_lock(&error_check_lock); //锁定已被持有pthread_create(&thread1, NULL, try_locking_thread, NULL);pthread_create(&thread2, NULL, try_locking_thread, NULL);pthread_join(thread1, NULL);pthread_join(thread2, NULL);pthread_mutex_unlock(&error_check_lock);return 0; }
递归锁避免死锁:
递归锁允许线程多次获取同一把锁,从而避免了因重复加锁而导致的死锁。
#include <pthread.h> #include <stdio.h>pthread_mutex_t recursive_lock = PTHREAD_MUTEX_INITIALIZER;void *recursive_locking_thread(void *arg) {int i;for (i = 0; i < 10; i++) {pthread_mutex_lock(&recursive_lock);printf("Lock acquired %d\n", i);pthread_mutex_unlock(&recursive_lock);}return NULL; }int main() {pthread_t thread1, thread2;pthread_mutexattr_t attr;pthread_mutexattr_init(&attr);pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);pthread_mutex_init(&recursive_lock, &attr);pthread_create(&thread1, NULL, recursive_locking_thread, NULL);pthread_create(&thread2, NULL, recursive_locking_thread, NULL);pthread_join(thread1, NULL);pthread_join(thread2, NULL);pthread_mutex_destroy(&recursive_lock);pthread_mutexattr_destroy(&attr);return 0; }
第二题:模拟火车过隧道场景,考虑不同类型列车的隧道选择。
第三题:编写两个线程的同步代码,具体场景未给出,需根据实际情况设计。
假设我们有一个场景,其中两个线程需要访问同一资源,但资源一次只能被一个线程访问。我们可以使用互斥锁来实现同步,确保资源的正确访问:
#include <pthread.h> #include <stdio.h>pthread_mutex_t resource_lock = PTHREAD_MUTEX_INITIALIZER; int resource_value = 0;void *thread_function(void *arg) {int thread_id = *(int*)arg;int i;for (i = 0; i < 10; i++) {pthread_mutex_lock(&resource_lock);resource_value++;printf("Thread %d increased resource value to %d\n", thread_id, resource_value);pthread_mutex_unlock(&resource_lock);}return NULL; }int main() {pthread_t threads[2];int thread_ids[2] = {1, 2};pthread_create(&threads, NULL, thread_function, (void*)&thread_ids);pthread_create(&threads[1], NULL, thread_function, (void*)&thread_ids[1]);pthread_join(threads, NULL);pthread_join(threads[1], NULL);return 0; }