线程不安全

my_mem_pool.h

 1 /*
 2   realize my own memory pool
 3 */
 4 #include <iostream>
 5 #include <list>
 6 #include <cstdio>
 7 #include <cstdlib>
 8 #include <set>
 9 class MemPool {
10 public:
11     // every time we call get, we can get the BlockSize bytes of memory
12     MemPool(int BlockSize, int PoolSize) : m_block_size(BlockSize), m_pool_size(PoolSize)
13         ,m_free_num(0) {
14         std::cout << __func__ << std::endl;
15         m_free_list.clear();
16         m_alloc_set.clear();
17     }
18 
19     ~MemPool() {
20         std::cout << __func__ << ",set_size = " << m_alloc_set.size() << std::endl;
21         for (std::set<void*>::iterator it = m_alloc_set.begin(); it != m_alloc_set.end(); ++it) {
22             free(*it);
23         }
24         for (std::list<void*>::iterator it = m_free_list.begin();
25             it != m_free_list.end(); ++it) {
26             free(*it);
27         }
28         m_free_num = 0;
29     }
30 
31     inline void* get() __attribute__((always_inline)) {
32         void* mem = NULL;
33         if (m_free_num > 0) {
34             --m_free_num;
35             mem = m_free_list.front();
36             m_free_list.pop_front();
37         } else {
38             mem = malloc(m_block_size);
39         }
40         m_alloc_set.insert(mem);
41         return mem;
42     }
43 
44     inline void release(void* p) __attribute__((always_inline)) {
45         if (m_free_num < m_pool_size) {
46             m_free_list.push_back(p);
47             ++m_free_num;
48         } else {
49             // destroy
50             free (p);
51         }
52         m_alloc_set.erase(p);
53     }
54 
55     int get_free_num() {
56         return m_free_num;
57     }
58 private:
59     int m_block_size;
60     int m_pool_size;
61     int m_free_num;  // the num of memory block in the pool which can be useed
62     std::list<void*> m_free_list;
63     std::set<void*>  m_alloc_set;
64 };

my_mem_pool.cpp

 1 #include "my_mem_pool.h"
 2 #include <iostream>
 3 #include <boost/shared_ptr.hpp>
 4 int main() {
 5     MemPool* pool = new MemPool(1024, 3);
 6     void* p1 = pool->get();
 7     void* p0 = pool->get();
 8     void* p2 = pool->get();
 9     std::cout << "p0 = " << p0 << std::endl;
10     std::cout << "p1 = " << p1 << std::endl;
11     std::cout << "p2 = " << p2 << std::endl;
12     std::cout << "size = " << pool->get_free_num() << std::endl;
13     pool->release(p0);
14     pool->release(p1);
15     pool->release(p2);
16     std::cout << "size = " << pool->get_free_num() << std::endl;
17     void* p3 = pool->get();
18     std::cout << "size = " << pool->get_free_num() << std::endl;
19     void* p4 = pool->get();
20     void* p5 = pool->get();
21     void* p6 = pool->get();
22     std::cout << "size = " << pool->get_free_num() << std::endl;
23     pool->release(p3);
24     pool->release(p4);
25     pool->release(p5);
26     delete pool;
27     std::cout << "size = " << pool->get_free_num() << std::endl;
28 }

 

posted on 2016-08-26 11:21  LyndonYoung  阅读(415)  评论(0编辑  收藏  举报