如何通过信号量记录某个数据的变化情况?给出详细的C++代码?
时间: 2024-03-14 19:47:51 浏览: 75
如果你希望通过信号量记录某个数据的变化情况,可以使用 std::atomic 类型和 std::condition_variable 类型来实现。下面是一个简单的 C++ 代码示例:
```c++
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <atomic>
std::atomic<int> data{0};
std::mutex mutex_;
std::condition_variable cond_;
void producer()
{
for (int i = 0; i < 10; ++i) {
std::unique_lock<std::mutex> lock(mutex_);
data.store(i);
cond_.notify_all();
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
}
void consumer()
{
int local_data = -1;
while (true) {
std::unique_lock<std::mutex> lock(mutex_);
cond_.wait(lock, []{ return data.load() != -1; });
local_data = data.load();
data.store(-1);
lock.unlock();
std::cout << "Consumed data: " << local_data << std::endl;
if (local_data == 9) {
break;
}
}
}
int main()
{
std::thread t1(producer);
std::thread t2(consumer);
t1.join();
t2.join();
return 0;
}
```
这个代码示例中,我们使用 std::atomic<int> 类型来存储数据,这是一个线程安全的数据类型。在生产者线程中,我们通过调用 data.store() 方法来更新数据,并通过调用 cond_.notify_all() 方法来通知消费者线程。在消费者线程中,我们使用 std::condition_variable 类型来等待数据的变化,并使用 cond_.wait() 方法来等待通知。在等待期间,消费者线程会释放锁,以便生产者线程可以更新数据。当消费者线程接收到通知后,它会重新获取锁,并使用 data.load() 方法来获取数据。由于使用了 std::atomic 类型,数据的读取和写入都是原子的,因此不需要额外的锁来保护数据。
阅读全文