`
田庆阳
  • 浏览: 6234 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

shared_ptr:多线程对共享申请资源的访问和回收

阅读更多
利用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
分享到:
评论

相关推荐

    C++智能指针shared-ptr讲解与使用.pdf

    这种设计消除了手动管理内存的需要,同时也保证了多线程环境下的安全,因为引用计数的增加和减少是原子操作。 `shared_ptr`是一个模板类,这意味着在创建`shared_ptr`实例时,必须指定它将要管理的对象类型。例如:...

    智能指针实现

    然而,`auto_ptr`有一些限制和陷阱,比如不支持拷贝构造和赋值操作,因为它们可能导致所有权的混乱,这在多线程或多对象交互的场景下容易引发问题。 在C++11中,`std::unique_ptr`取代了`auto_ptr`,提供了更强的...

    C++ 智能指针深入解析

    多个`shared_ptr`可以同时拥有同一个对象,当最后一个`shared_ptr`被销毁时,对象会被释放。 - `std::weak_ptr`:它是`shared_ptr`的非拥有版本,用于解决循环引用问题。`weak_ptr`不能直接访问对象,必须先检查...

    理解 Android sp wp 指针

    - **使用**:在多个地方需要共享同一个对象时,可以使用`std::shared_ptr`,它会自动处理引用计数,确保在所有实例都释放后才删除对象。 - **注意**:`std::shared_ptr`之间是线程安全的,但与其他类型(如原始...

    Android应用程序框架——智能指针 系列文章源代码

    在多线程环境下,或者当多个组件需要访问同一个对象时,std::shared_ptr可以提供安全的内存管理。 在Android开发中,特别是在使用NDK进行原生代码编程时,智能指针是处理Java对象到C++对象转换的关键。JNI(Java ...

    C++实例——垃圾清理系统

    同时,这个系统可能还需要考虑到线程安全,因为多线程环境下对资源的访问可能导致并发问题。 总结起来,C++中的垃圾清理系统是一个综合了智能指针、构造/析构函数、RAII原则以及可能的线程安全策略的复杂主题。理解...

    智能指针的一个实现 中科大 面向对象课程

    计数指针的实现通常涉及到原子操作(atomic operations),以确保在多线程环境下引用计数的更新是线程安全的。这通常通过C++的`std::atomic`库来实现,保证了在并发环境下引用计数的增加和减少不会出现数据竞争问题...

    C++内存管理

    在多线程环境下,内存模型决定了线程间如何共享和同步数据。C++11引入了`std::atomic`来实现线程安全的内存访问,避免数据竞争。 七、RAII(Resource Acquisition Is Initialization) RAII是一种编程原则,通过...

    C++多核高级编程中文高清版.zip

    2. **智能指针**:在多线程环境中,内存管理变得复杂,智能指针如`std::unique_ptr`, `std::shared_ptr`和`std::weak_ptr`提供了自动的垃圾回收机制,防止了内存泄漏和悬挂指针的问题。 3. **STL(标准模板库)**:...

    垃圾回收器是什么1

    这种方式在单线程环境下效果良好,但在多线程环境下,如果对象被多个线程共享,引用计数可能无法准确反映对象的使用情况,这时就需要更复杂的垃圾回收策略。 引用计数是一种常见的垃圾回收策略,广泛应用于Perl、...

    代码优化:有效使用内存 rar

    7. 并发内存管理:在多线程环境中,同步原语的使用要谨慎,避免死锁和竞态条件,合理使用线程局部存储来减少共享内存的冲突。 8. 字符串和缓冲区管理:避免不必要的字符串拷贝,合理预估缓冲区大小,避免频繁扩容。...

    MYCLL(定位内存组合包).rar

    9. **多线程下的内存管理**:在多线程环境下,共享内存的同步和互斥操作,如使用锁(mutex)来保护内存访问。 10. **内存分析**:通过分析工具(如gprof,VisualVM等)来了解程序的内存使用情况,找出瓶颈。 这个...

    EasyTcpServer-内存管理总结.zip

    5. 并发控制:多线程环境下的内存管理需谨慎,避免数据竞争和死锁。使用互斥量、信号量等同步机制保护共享资源。 6. 性能监控:定期分析内存使用情况,使用内存分析工具(如Valgrind、VisualVM等)找出潜在的内存...

    单用户模拟操作系统课程设计(附代码)

    这可能涉及到线程的使用,因为在一个单用户的环境中,多任务通常是通过多线程来实现的。C++标准库提供了`std::thread`类来支持线程操作。进程间通信(IPC)可以通过共享内存、消息队列或管道等方式实现。 3. 文件...

    堆优化器.zip

    综上所述,"堆优化器.zip"可能包含了关于内存管理、垃圾回收、内存碎片控制、智能指针使用、数据结构优化和多线程环境下内存共享的最佳实践等内容,这些都是开发高性能应用时需要深入了解和掌握的关键技能。...

    编程技巧汇集

    2. **智能指针**:在C++中,智能指针(如`std::unique_ptr`, `std::shared_ptr`)可以自动管理内存,防止资源泄露。 3. **内存池**:通过内存池技术,预先分配一大块内存,然后按需分配小块内存,减少系统调用,...

    C++操作系统课设-进程管理

    例如,可以使用`std::mutex`保证对共享资源的独占访问,使用`std::condition_variable`协调进程的等待和唤醒。 5. **进程通信**:进程间通信(IPC)允许进程之间交换数据。在C++中,可以使用管道(pipe)、消息队列...

    bic.zip_进程与线程_Visual_C++_

    - 使用智能指针(如`std::shared_ptr`)可以自动管理资源,减少资源泄漏的风险,特别是在多线程环境下。 6. **Visual Studio调试多线程** - Visual Studio IDE提供了强大的调试工具,如并行堆栈窗口(Parallel ...

    堆内存:机制、管理与优化-现代编程中的核心挑战与最佳实践探索.docx

    - **对象实例**:面向对象编程中,对象通常存储在堆内存中,方便多线程或跨函数访问。 #### 四、最佳实践 为有效管理堆内存,需要遵循一些最佳实践: - **防止内存泄漏**:确保在不再需要内存时及时释放。 - **...

    使用C++语言编写的操作系统课程设计

    C++的智能指针(如`std::unique_ptr`和`std::shared_ptr`)可以帮助我们实现自动内存管理。 9. **I/O管理**:操作系统处理设备输入输出,通常使用缓冲区和异步I/O来提高效率。C++的文件流库(`&lt;fstream&gt;`)和异步I/...

Global site tag (gtag.js) - Google Analytics