临界区多线程互斥c语言 银行存取款
时间: 2024-01-04 22:00:42 浏览: 42
临界区是指在多线程编程中,多个线程共享的临界资源对应的代码片段。例如,在一个银行存取款的场景中,假设有多个客户同时进行存取款操作,每个客户对应一个线程。为了保证数据的一致性和正确性,需要通过临界区来实现线程的互斥访问。
在C语言中,可以使用互斥锁(mutex)来实现临界区的互斥访问。互斥锁是一种同步机制,用于保护共享资源,确保同时只有一个线程可以访问临界区。下面是一个简单的银行存取款的示例:
```
#include <stdio.h>
#include <pthread.h>
int balance = 1000; // 银行账户余额
pthread_mutex_t mutex; // 互斥锁
void* deposit(void* arg) {
pthread_mutex_lock(&mutex); // 上锁
int* amount = (int*)arg;
balance += *amount;
printf("存款 %d 元,余额为 %d 元\n", *amount, balance);
pthread_mutex_unlock(&mutex); // 解锁
return NULL;
}
void* withdraw(void* arg) {
pthread_mutex_lock(&mutex); // 上锁
int* amount = (int*)arg;
if (balance >= *amount) {
balance -= *amount;
printf("取款 %d 元,余额为 %d 元\n", *amount, balance);
} else {
printf("余额不足\n");
}
pthread_mutex_unlock(&mutex); // 解锁
return NULL;
}
int main() {
pthread_t tid1, tid2;
int amount1 = 500;
int amount2 = 200;
pthread_mutex_init(&mutex, NULL); // 初始化互斥锁
pthread_create(&tid1, NULL, deposit, &amount1); // 创建存款线程
pthread_create(&tid2, NULL, withdraw, &amount2); // 创建取款线程
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
pthread_mutex_destroy(&mutex); // 销毁互斥锁
return 0;
}
```
在这个示例中,通过互斥锁mutex来保护临界资源balance。存款和取款操作都加了互斥锁,确保每次只有一个线程访问临界区。这样就避免了多个线程同时修改balance导致数据不一致的问题。最后,通过pthread_mutex_init()初始化互斥锁,pthread_mutex_lock()上锁,pthread_mutex_unlock()解锁,pthread_mutex_destroy()销毁互斥锁来完成对临界区的互斥访问。