有两个线程,线程A负责对一个数据进行加法操作,线程B负责对这个数据进行减法操作。初始时数据为0。要求操作过程中始终保证数据的有效性,即在任意时刻都不能小于0。如果数据小于0,线程必须等待,直到数据变得可用。
时间: 2024-02-01 20:13:14 浏览: 22
这个问题可以通过使用互斥锁(mutex)和条件变量(condition variable)来解决。
首先,我们需要定义一个共享变量来存储数据,以及一个互斥锁来保证对该变量的访问是线程安全的。在C++中,可以使用std::mutex来实现互斥锁。
接下来,我们需要定义两个条件变量,分别用于线程A和线程B等待数据变得可用。在C++中,可以使用std::condition_variable来实现条件变量。
线程A的操作是对共享变量执行加法操作。在执行加法操作之前,线程A需要获取互斥锁,并且检查共享变量是否小于0。如果共享变量小于0,则线程A需要等待,直到共享变量变得可用。否则,线程A可以执行加法操作,并且释放互斥锁。
线程B的操作类似于线程A,但是执行的是减法操作。
下面是一个示例代码:
```c++
#include <mutex>
#include <condition_variable>
std::mutex mtx;
std::condition_variable cvA, cvB;
int data = 0;
void threadA()
{
while (true) {
std::unique_lock<std::mutex> lock(mtx);
while (data < 0) {
cvA.wait(lock);
}
data += 1; // 执行加法操作
if (data < 0) {
data = 0;
}
cvB.notify_one();
}
}
void threadB()
{
while (true) {
std::unique_lock<std::mutex> lock(mtx);
while (data < 0) {
cvB.wait(lock);
}
data -= 1; // 执行减法操作
if (data < 0) {
data = 0;
}
cvA.notify_one();
}
}
```
在上面的代码中,两个线程都是无限循环的,以便不断地进行操作。当共享变量小于0时,线程会等待条件变量,直到共享变量变得可用,然后执行相应的操作,并且通知另一个线程。注意,在执行操作之前,线程必须获取互斥锁,并且在执行完操作后释放互斥锁。