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));
}
} 运行结果:
发个参考代码。。。。
#include
#include
#include
#include
#include
#include
template
class SharedObject {
public:
SharedObject(const T & init = T()) : data_(init) {}
SharedObject(const SharedObject
SharedObject & operator =(const SharedObject
const T & read() const {
std::lock_guard
return data_;
}
void write(const T & data) {
std::lock_guard
data_ = data;
}
private:
T data_;
std::mutex m_;
};
void work1(SharedObject
void work2(SharedObject
int main() {
SharedObject
std::thread producer(work1, std::ref(so)), consumer(work2, std::ref(so));
std::cin.get();
producer.detach();
consumer.detach();
}
void work1(SharedObject
while(true) {
std::cout << so.read() << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(500));
}
}
void work2(SharedObject
srand(time(nullptr));
while(true) {
so.write(rand() % 100);
std::this_thread::sleep_for(std::chrono::milliseconds(500));
}
} 运行结果:
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯