VC++处理一个多线程的一个经典问题
经典的多线程问题之一是生产者-消费者问题。该问题触及到两个角色:生产者和消费者,它们共享一个缓冲区。生产者将产品放入缓冲区,消费者从缓冲区取生产品。但是,缓冲区有限,并且在缓冲区已满或为空时,生产者和消费者一定要等待。
下面是一个使用VC++编写的生产者-消费者问题的简单示例:
```cpp
#include
#include
#include
#include
#include
std::queue
const int bufferSize = 10;
std::mutex mtx;
std::condition_variable producerCV, consumerCV;
void producer() {
for (int i = 0; i < 20; ++i) {
std::unique_lock
producerCV.wait(lock, [] { return buffer.size() < bufferSize; });
buffer.push(i);
std::cout << "Produced: " << i << std::endl;
lock.unlock();
consumerCV.notify_one();
}
}
void consumer() {
for (int i = 0; i < 20; ++i) {
std::unique_lock
consumerCV.wait(lock, [] { return !buffer.empty(); });
int value = buffer.front();
buffer.pop();
std::cout << "Consumed: " << value << std::endl;
lock.unlock();
producerCV.notify_one();
}
}
int main() {
std::thread producerThread(producer);
std::thread consumerThread(consumer);
producerThread.join();
consumerThread.join();
return 0;
}
```
在上述示例中,我们使用一个互斥锁(`std::mutex`)来保护共享资源(缓冲区)。`std::condition_variable`用于在缓冲区满或为空时,生产者和消费者进行等待和通知。
`producer`函数摹拟生产者的行动:生产产品并将其放入缓冲区。如果缓冲区已满,生产者线程将等待,直到消费者线程取出一个产品。
`consumer`函数摹拟消费者的行动:从缓冲区取生产品并消费。如果缓冲区为空,消费者线程将等待,直到生产者线程放入一个产品。
在`main`函数中,我们创建了两个线程分别履行生产者和消费者函数,并等待它们完成。
以上示例是一个简单的多线程问题的解决方案,但在实际利用中可能需要斟酌更多的情况,如线程同步、死锁避免等。
TOP