临界区(Critical Section):在多线程或多进程编程中,临界区是指一段代码,这段代码访问共享资源(如变量、文件、内存等),并且当多个线程或进程同时执行这段代码时,可能会导致数据不一致或其他问题。
互斥量(Mutex,Mutual Exclusion):互斥量是一种同步机制,用于保护临界区。它确保在任何时刻只有一个线程或进程可以进入临界区。互斥量通常通过锁定和解锁操作来实现。
以下是一个使用互斥量保护临界区的简单示例,使用C语言和POSIX线程库(pthread):
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
int shared_variable = 0;
pthread_mutex_t mutex;
void* thread_function(void* arg) {
for (int i = 0; i < 100000; ++i) {
pthread_mutex_lock(&mutex); // 进入临界区前加锁
shared_variable++;
pthread_mutex_unlock(&mutex); // 离开临界区后解锁
}
return NULL;
}
int main() {
pthread_t thread1, thread2;
pthread_mutex_init(&mutex, NULL); // 初始化互斥量
pthread_create(&thread1, NULL, thread_function, NULL);
pthread_create(&thread2, NULL, thread_function, NULL);
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
printf("Final value of shared_variable: %d\n", shared_variable);
pthread_mutex_destroy(&mutex); // 销毁互斥量
return 0;
}
问题:死锁(Deadlock)
原因:当两个或多个线程或进程互相等待对方释放资源时,就会发生死锁。
解决方法:
示例代码(避免死锁):
void* thread_function(void* arg) {
pthread_mutex_lock(&mutex1); // 先获取锁1
pthread_mutex_lock(&mutex2); // 再获取锁2
// 访问共享资源
pthread_mutex_unlock(&mutex2); // 先释放锁2
pthread_mutex_unlock(&mutex1); // 再释放锁1
return NULL;
}
通过以上方法,可以有效避免死锁问题,确保程序的稳定性和可靠性。