利用shared_ptr的共享引用计数、引用结束资源系统回收的机制,实现多线程对共享申请资源的访问和回收。
#include <vector>
#include <memory>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <iostream>
using namespace std;
class Student
{
public:
Student()
{
}
~Student()
{
std::cout << "Student Destructor" << std::endl;
}
public:
size_t number;
};
std::shared_ptr<Student> g_object;
pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;
class Mutex
{
public:
Mutex(pthread_mutex_t mutex) : own_mutex(mutex)
{
pthread_mutex_lock(&own_mutex);
std::cout << "mutex lock id" << pthread_self() << std::endl;
}
~Mutex()
{
pthread_mutex_unlock(&own_mutex);
std::cout << "mutex unlock id" << pthread_self() << std::endl;
}
public:
pthread_mutex_t own_mutex;
};
class Test
{
public:
static void* Change(void* pData)
{
while (true)
{
{
Mutex temp_mutex(g_mutex);
std::shared_ptr<Student> temp_module(new Student());
g_object = temp_module;
g_object->number = random();
std::cout << "change thread id = " << pthread_self() << " number = " << g_object->number << std::endl;
}
sleep(1);
}
}
static void* Display(void* pData)
{
while (true)
{
{
Mutex temp_mutex(g_mutex);
if (NULL == g_object)
{
std::cout << "work thread id = " << pthread_self() << " g_obj is null" << std::endl;
}
else
{
std::shared_ptr<Student> temp_module = g_object;
std::cout << "work thread id = " << pthread_self() << " number = " << (*temp_module).number << std::endl;
}
}
sleep(2.3);
}
}
};
int main()
{
pthread_t tid;
std::vector<pthread_t> tid_vec;
pthread_create(&tid, NULL, Test::Change, NULL);
std::cout << "change thread id = " << tid << std::endl;
tid_vec.push_back(tid);
for (int uli = 0; uli < 2; ++uli)
{
pthread_create(&tid, NULL, Test::Display, NULL);
std::cout << "work thread id = " << tid << std::endl;
tid_vec.push_back(tid);
}
for (auto iter = tid_vec.begin(); iter != tid_vec.end(); ++iter)
{
pthread_join(*iter, NULL);
}
return 0;
}
//g++ -oxx -pthread tqy.cpp --std=c++11
分享到:
相关推荐
这种设计消除了手动管理内存的需要,同时也保证了多线程环境下的安全,因为引用计数的增加和减少是原子操作。 `shared_ptr`是一个模板类,这意味着在创建`shared_ptr`实例时,必须指定它将要管理的对象类型。例如:...
然而,`auto_ptr`有一些限制和陷阱,比如不支持拷贝构造和赋值操作,因为它们可能导致所有权的混乱,这在多线程或多对象交互的场景下容易引发问题。 在C++11中,`std::unique_ptr`取代了`auto_ptr`,提供了更强的...
多个`shared_ptr`可以同时拥有同一个对象,当最后一个`shared_ptr`被销毁时,对象会被释放。 - `std::weak_ptr`:它是`shared_ptr`的非拥有版本,用于解决循环引用问题。`weak_ptr`不能直接访问对象,必须先检查...
- **使用**:在多个地方需要共享同一个对象时,可以使用`std::shared_ptr`,它会自动处理引用计数,确保在所有实例都释放后才删除对象。 - **注意**:`std::shared_ptr`之间是线程安全的,但与其他类型(如原始...
在多线程环境下,或者当多个组件需要访问同一个对象时,std::shared_ptr可以提供安全的内存管理。 在Android开发中,特别是在使用NDK进行原生代码编程时,智能指针是处理Java对象到C++对象转换的关键。JNI(Java ...
同时,这个系统可能还需要考虑到线程安全,因为多线程环境下对资源的访问可能导致并发问题。 总结起来,C++中的垃圾清理系统是一个综合了智能指针、构造/析构函数、RAII原则以及可能的线程安全策略的复杂主题。理解...
计数指针的实现通常涉及到原子操作(atomic operations),以确保在多线程环境下引用计数的更新是线程安全的。这通常通过C++的`std::atomic`库来实现,保证了在并发环境下引用计数的增加和减少不会出现数据竞争问题...
在多线程环境下,内存模型决定了线程间如何共享和同步数据。C++11引入了`std::atomic`来实现线程安全的内存访问,避免数据竞争。 七、RAII(Resource Acquisition Is Initialization) RAII是一种编程原则,通过...
2. **智能指针**:在多线程环境中,内存管理变得复杂,智能指针如`std::unique_ptr`, `std::shared_ptr`和`std::weak_ptr`提供了自动的垃圾回收机制,防止了内存泄漏和悬挂指针的问题。 3. **STL(标准模板库)**:...
这种方式在单线程环境下效果良好,但在多线程环境下,如果对象被多个线程共享,引用计数可能无法准确反映对象的使用情况,这时就需要更复杂的垃圾回收策略。 引用计数是一种常见的垃圾回收策略,广泛应用于Perl、...
7. 并发内存管理:在多线程环境中,同步原语的使用要谨慎,避免死锁和竞态条件,合理使用线程局部存储来减少共享内存的冲突。 8. 字符串和缓冲区管理:避免不必要的字符串拷贝,合理预估缓冲区大小,避免频繁扩容。...
9. **多线程下的内存管理**:在多线程环境下,共享内存的同步和互斥操作,如使用锁(mutex)来保护内存访问。 10. **内存分析**:通过分析工具(如gprof,VisualVM等)来了解程序的内存使用情况,找出瓶颈。 这个...
5. 并发控制:多线程环境下的内存管理需谨慎,避免数据竞争和死锁。使用互斥量、信号量等同步机制保护共享资源。 6. 性能监控:定期分析内存使用情况,使用内存分析工具(如Valgrind、VisualVM等)找出潜在的内存...
这可能涉及到线程的使用,因为在一个单用户的环境中,多任务通常是通过多线程来实现的。C++标准库提供了`std::thread`类来支持线程操作。进程间通信(IPC)可以通过共享内存、消息队列或管道等方式实现。 3. 文件...
综上所述,"堆优化器.zip"可能包含了关于内存管理、垃圾回收、内存碎片控制、智能指针使用、数据结构优化和多线程环境下内存共享的最佳实践等内容,这些都是开发高性能应用时需要深入了解和掌握的关键技能。...
2. **智能指针**:在C++中,智能指针(如`std::unique_ptr`, `std::shared_ptr`)可以自动管理内存,防止资源泄露。 3. **内存池**:通过内存池技术,预先分配一大块内存,然后按需分配小块内存,减少系统调用,...
例如,可以使用`std::mutex`保证对共享资源的独占访问,使用`std::condition_variable`协调进程的等待和唤醒。 5. **进程通信**:进程间通信(IPC)允许进程之间交换数据。在C++中,可以使用管道(pipe)、消息队列...
- 使用智能指针(如`std::shared_ptr`)可以自动管理资源,减少资源泄漏的风险,特别是在多线程环境下。 6. **Visual Studio调试多线程** - Visual Studio IDE提供了强大的调试工具,如并行堆栈窗口(Parallel ...
- **对象实例**:面向对象编程中,对象通常存储在堆内存中,方便多线程或跨函数访问。 #### 四、最佳实践 为有效管理堆内存,需要遵循一些最佳实践: - **防止内存泄漏**:确保在不再需要内存时及时释放。 - **...
C++的智能指针(如`std::unique_ptr`和`std::shared_ptr`)可以帮助我们实现自动内存管理。 9. **I/O管理**:操作系统处理设备输入输出,通常使用缓冲区和异步I/O来提高效率。C++的文件流库(`<fstream>`)和异步I/...