有两个线程,线程A负责对一个数据进行加法操作,线程B负责对这个数据进行减法操作。初始时数据为0。要求操作过程中始终保证数据的有效性,即在任意时刻都不能小于0。如果数据小于0,线程必须等待,直到数据变得可用。
时间: 2024-02-01 07:13:07 浏览: 10
可以使用互斥锁和条件变量来实现。
首先定义一个互斥锁和条件变量:
```c++
#include <mutex>
#include <condition_variable>
std::mutex mtx;
std::condition_variable cv;
```
然后在线程A中进行加法操作,如果数据小于0,则等待条件变量:
```c++
void threadA() {
while (true) {
std::unique_lock<std::mutex> lock(mtx);
// 如果数据小于0,则等待条件变量
while (data < 0) {
cv.wait(lock);
}
// 进行加法操作
data += 1;
std::cout << "Thread A: data = " << data << std::endl;
// 通知条件变量
cv.notify_one();
}
}
```
在线程B中进行减法操作,同样需要等待条件变量:
```c++
void threadB() {
while (true) {
std::unique_lock<std::mutex> lock(mtx);
// 如果数据小于0,则等待条件变量
while (data < 0) {
cv.wait(lock);
}
// 进行减法操作
data -= 1;
std::cout << "Thread B: data = " << data << std::endl;
// 通知条件变量
cv.notify_one();
}
}
```
最后需要在主函数中启动这两个线程:
```c++
int main() {
std::thread tA(threadA);
std::thread tB(threadB);
tA.join();
tB.join();
return 0;
}
```
这样就可以实现对一个数据进行加法和减法操作,并保证在任意时刻数据的有效性。
阅读全文