永发信息网

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

答案:1  悬赏:50  手机版
解决时间 2021-11-24 19:02
  • 提问者网友:趣果有间
  • 2021-11-24 14:28
c++多线程中怎么实现信号量或者互斥量在多个线程之间的使用?
最佳答案
  • 五星知识达人网友:你可爱的野爹
  • 2021-11-24 14:47
生产者消费者访问的都是同一个共享对象,这个共享对象提供读写操作,然后生产者线程调用写操作,消费者线程调用同一对象读操作,在这个共享对象里定义一个信号量,在读写成员函数中保证互斥就行了。估计你用的是Win32 API 或者 Pthread API吧。。。。呵呵,那些东西太底层了。


发个参考代码。。。。


#include 
#include 
#include 
#include 
#include 
#include 

template 
class SharedObject {
public:
SharedObject(const T & init = T()) : data_(init) {}
SharedObject(const SharedObject &) = delete; 
SharedObject & operator =(const SharedObject &) = delete;
const T & read() const {
std::lock_guard lg(const_cast(m_));
return data_;
}
void write(const T & data) {
std::lock_guard lg(m_);
data_ = data;
}
private:
T data_;
std::mutex m_;
};


void work1(SharedObject & os);
void work2(SharedObject & os);

int main() {
SharedObject so;
std::thread producer(work1, std::ref(so)), consumer(work2, std::ref(so));
std::cin.get();
producer.detach();
consumer.detach();
}


void work1(SharedObject & so) {
while(true) {
std::cout << so.read() << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(500));
}
}
void work2(SharedObject & so) {
srand(time(nullptr));
while(true) {
so.write(rand() % 100);
std::this_thread::sleep_for(std::chrono::milliseconds(500));
}
} 运行结果:

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯