手撕生产者消费者 c++
时间: 2023-08-29 11:11:48 浏览: 108
引用<span class="em">1</span>
#### 引用[.reference_title]
- *1* [C++面试:手写实现生产者消费者模型](https://blog.csdn.net/weixin_42869227/article/details/124349271)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
相关问题
手撕C++观察者模式
观察者模式是一种设计模式,用于实现对象之间的一对多依赖关系。在观察者模式中,当一个对象的状态发生变化时,它的所有依赖对象都会收到通知并自动更新。这种模式可以实现松耦合,使得对象之间的交互更加灵活。
在给出的代码中,实现了一个简单的观察者模式。首先,在`Events`类中,通过`Connect`方法注册观察者函数,可以支持右值引用和左值。然后,通过`Disconnect`方法可以移除观察者。最后,通过`Notify`方法可以通知所有的观察者,并传递参数。
在`main`函数中,创建了一个`Events`对象`e`,并注册了不同类型的观察者函数。其中,使用了lambda表达式、仿函数和成员函数作为观察者函数。通过调用`Notify`方法,可以触发所有注册的观察者函数,并传递参数。
需要注意的是,给出的代码只是一个简单的示例,实际的观察者模式可能会更加复杂,涉及到更多的设计和实现细节。同时,观察者模式也有一些缺点,比如多线程环境下可能存在创建多个对象的风险。因此,在实际应用中需要根据具体情况进行设计和优化。[1][2][3]
C++手撕unique_ptr
unique_ptr 是 C++11 标准提供的智能指针,用于管理动态分配的对象。它使用了独占所有权的概念,保证了在不再需要指针时自动释放资源,从而避免了内存泄漏。
手撕 unique_ptr 的实现涉及到指针的拷贝和移动语义。下面是一个简单的手撕 unique_ptr 的示例代码:
```cpp
template <typename T>
class unique_ptr {
public:
explicit unique_ptr(T* ptr = nullptr) : ptr_(ptr) {}
~unique_ptr() {
delete ptr_;
}
unique_ptr(const unique_ptr&) = delete; // 禁用拷贝构造函数
unique_ptr& operator=(const unique_ptr&) = delete; // 禁用拷贝赋值运算符
unique_ptr(unique_ptr&& other) noexcept : ptr_(other.ptr_) {
other.ptr_ = nullptr;
}
unique_ptr& operator=(unique_ptr&& other) noexcept {
if (this != &other) {
delete ptr_;
ptr_ = other.ptr_;
other.ptr_ = nullptr;
}
return *this;
}
T& operator*() const {
return *ptr_;
}
T* operator->() const {
return ptr_;
}
T* get() const {
return ptr_;
}
private:
T* ptr_;
};
```
上述代码中,我们定义了一个类模板 `unique_ptr`,它模拟了标准库中的 `std::unique_ptr` 功能。在构造函数中,我们接受一个指针作为参数,并将其保存在 `ptr_` 成员变量中。析构函数负责释放指针所指向的资源。为了遵循独占所有权的原则,我们禁用了拷贝构造函数和拷贝赋值运算符,而使用移动语义来实现赋值操作。`operator*` 和 `operator->` 用于重载解引用操作符,方便使用指针指向的对象。
需要注意的是,上述实现只是一个简单的手撕版 unique_ptr,并没有处理更复杂的边界情况和异常安全性。在实际使用中,建议使用标准库提供的 `std::unique_ptr`,它已经经过了充分测试和优化。
阅读全文