创建两个线程,一个线程递增一个全局变量,另一个线程递减这个全局变量,重复操作五次
时间: 2024-09-20 11:14:45 浏览: 52
linux之线程同步一.doc
在 C 语言中,为了安全地在线程间共享和修改全局变量,我们需要使用互斥量(mutexes)或者信号量(semaphores)来防止竞态条件。这里是一个使用互斥量的例子,展示了如何创建两个线程分别递增和递减全局变量:
首先,需要包含必要的头文件:
```c
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h> // 包含 malloc 和 free
#include <unistd.h> // 包含 sleep,模拟延迟
#include <pthread_mutex.h> // 包含互斥量
```
然后定义一个全局变量、互斥量和递增/递减的函数:
```c
int global_var = 0; // 全局变量
pthread_mutex_t mutex; // 互斥量
int increment, decrement; // 用于计数递增和递减的次数
void *increment_thread(void *arg) {
for (int i = 0; i < 5; ++i) {
pthread_mutex_lock(&mutex); // 加锁
global_var++;
printf("Incremented to: %d\n", global_var);
increment++; // 自增递增计数
pthread_mutex_unlock(&mutex); // 解锁
sleep(1); // 模拟延迟
}
return NULL;
}
void *decrement_thread(void *arg) {
for (int i = 0; i < 5; ++i) {
pthread_mutex_lock(&mutex); // 加锁
global_var--;
printf("Decremented to: %d\n", global_var);
decrement++; // 自增递减计数
pthread_mutex_unlock(&mutex); // 解锁
sleep(1); // 模拟延迟
}
return NULL;
}
```
最后,在 `main` 函数中初始化互斥量,并创建和启动两个线程:
```c
int main() {
pthread_mutex_init(&mutex, NULL); // 初始化互斥量
pthread_t inc_thread, dec_thread;
increment = decrement = 0; // 初始化递增和递减计数
// 创建递增线程
pthread_create(&inc_thread, NULL, &increment_thread, NULL);
// 创建递减线程
pthread_create(&dec_thread, NULL, &decrement_thread, NULL);
// 等待两个线程完成
pthread_join(inc_thread, NULL);
pthread_join(dec_thread, NULL);
// 清理资源
pthread_mutex_destroy(&mutex);
return 0;
}
```
注意:为了避免死锁,必须按照相同的顺序解锁互斥量。
阅读全文