有两个线程,线程A负责对一个数据进行加法操作,线程B负责对这个数据进行减法操作。初始时数据为0。要求操作过程中始终保证数据的有效性,即在任意时刻都不能小于0。如果数据小于0,线程必须等待,直到数据变得可用。
时间: 2024-02-01 12:13:09 浏览: 11
两个线程,一个求最大数,一个用图形化窗口显示出来,适合新人学习或当作业
5星 · 资源好评率100%
这个问题可以通过使用锁来解决。下面是一个可能的解决方案:
```
#include <pthread.h>
#include <stdio.h>
pthread_mutex_t lock;
int data = 0;
void* add(void* arg) {
while (1) {
pthread_mutex_lock(&lock);
data += 1;
if (data < 0) {
printf("Invalid data!\n");
data -= 1;
}
printf("Add: %d\n", data);
pthread_mutex_unlock(&lock);
}
}
void* sub(void* arg) {
while (1) {
pthread_mutex_lock(&lock);
data -= 1;
if (data < 0) {
printf("Invalid data!\n");
data += 1;
}
printf("Sub: %d\n", data);
pthread_mutex_unlock(&lock);
}
}
int main() {
pthread_t tid1, tid2;
pthread_mutex_init(&lock, NULL);
pthread_create(&tid1, NULL, add, NULL);
pthread_create(&tid2, NULL, sub, NULL);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
pthread_mutex_destroy(&lock);
return 0;
}
```
在这个程序中,我们定义了两个线程add和sub,分别负责对数据进行加法和减法操作。我们使用了一个互斥锁lock来保护数据的并发访问。在每个线程中,我们首先获取锁,然后对数据进行加/减操作,如果数据小于0,说明数据无效,我们需要将数据恢复到操作前的状态,并打印一条错误信息。最后,我们释放锁,让其他线程可以获取锁并进行操作。
需要注意的是,在使用互斥锁的时候,我们需要确保每个线程都正确地获取和释放锁。如果某个线程没有正确地释放锁,那么其他线程就无法获取锁,程序就会陷入死锁状态。因此,在生产环境中,我们需要仔细检查代码,确保每个线程都正确地获取和释放锁。
阅读全文