c++多线程中怎么实现信号量或者互斥量在多个线程之间的使用?
就是一个简单的生产者和消费者的双线程问题,本来可以将互斥量或者信号量设置成全局变量来实现,现在希望能够将生产者和消费者这两个线程类作为两个对象封装到一个类的private...
就是一个简单的生产者和消费者的双线程问题,本来可以将互斥量或者信号量设置成全局变量来实现,现在希望能够将生产者和消费者这两个线程类作为两个对象封装到一个类的private里面去,那这样一来应该怎么声明信号量或者互斥量?
...希望高手能行行好... 展开
...希望高手能行行好... 展开
1个回答
展开全部
生产者消费者访问的都是同一个共享对象,这个共享对象提供读写操作,然后生产者线程调用写操作,消费者线程调用同一对象读操作,在这个共享对象里定义一个信号量,在读写成员函数中保证互斥就行了。估计你用的是Win32 API 或者 Pthread API吧。。。。呵呵,那些东西太底层了。
发个参考代码。。。。
#include <thread>
#include <mutex>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <functional>
template <typename T>
class SharedObject {
public:
SharedObject(const T & init = T()) : data_(init) {}
SharedObject(const SharedObject<T> &) = delete;
SharedObject & operator =(const SharedObject<T> &) = delete;
const T & read() const {
std::lock_guard<std::mutex> lg(const_cast<std::mutex &>(m_));
return data_;
}
void write(const T & data) {
std::lock_guard<std::mutex> lg(m_);
data_ = data;
}
private:
T data_;
std::mutex m_;
};
void work1(SharedObject<int> & os);
void work2(SharedObject<int> & os);
int main() {
SharedObject<int> so;
std::thread producer(work1, std::ref(so)), consumer(work2, std::ref(so));
std::cin.get();
producer.detach();
consumer.detach();
}
void work1(SharedObject<int> & so) {
while(true) {
std::cout << so.read() << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(500));
}
}
void work2(SharedObject<int> & so) {
srand(time(nullptr));
while(true) {
so.write(rand() % 100);
std::this_thread::sleep_for(std::chrono::milliseconds(500));
}
}
运行结果:
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询