c++多线程中怎么实现信号量或者互斥量在多个线程之间的使用?

就是一个简单的生产者和消费者的双线程问题,本来可以将互斥量或者信号量设置成全局变量来实现,现在希望能够将生产者和消费者这两个线程类作为两个对象封装到一个类的private... 就是一个简单的生产者和消费者的双线程问题,本来可以将互斥量或者信号量设置成全局变量来实现,现在希望能够将生产者和消费者这两个线程类作为两个对象封装到一个类的private里面去,那这样一来应该怎么声明信号量或者互斥量?

...希望高手能行行好...
展开
 我来答
GNU_CPP0x
推荐于2016-06-23 · 超过18用户采纳过TA的回答
知道答主
回答量:31
采纳率:0%
帮助的人:43.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));
}
}

 运行结果:

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式