免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5695 | 回复: 11
打印 上一主题 下一主题

C++在实现list时,是否已经添加了锁。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-05 16:58 |只看该作者 |倒序浏览
弱弱问一句,C++在实现list时,是否已经添加了锁。
如:我在遍历的时候,为什么不允许添加,直到遍历结束才会添加(或删除),或者添加成功后,才会继续遍历。这是个什么原理?
代码如下:
37 void TestList::AddNode()                                                                        
38 {
39     Node_t *tmp = new Node_t;                                                                    
40     tmp->value = count;                                                                          
41     usleep(3000);                                                                                
42     int_list->push_back(tmp);
43     std::cout << "push successful [" << tmp->value << "]" << std::endl;                          
44     count++;
45 }   
46     
新开的一个线程
47 void *TestList::Thread_fun(void *arg)                                                            
48 {   
49     TestList *tlp = (TestList *)arg;                                                            
50     std::cout << "thread start" << std::endl;                                                   
51    while(tlp->flag)                                                                              
52    {
53        list<Node_t *>::iterator iter = tlp->int_list->begin();                                   
54        while(iter != tlp->int_list->end())                                                      
55        {                                                                                         
56            std::cout << "value: " << (*iter)->value << " ";                                      
57            if((*iter)->value == 4)                                                               
58                std::cout << std::endl;                                                           
59            iter++;                                                                              
60        }
61        std::cout << std::endl;                                                                  
62        //sleep(1);                                                                              
63        usleep(100);                                                                              
64    }
65 }  

从list中移除节点:
84 bool TestList::RemoveNode(int value)
85 {
86     list<Node_t *>::iterator iter = int_list->begin();
87     while(iter != int_list->end())
88     {
89         if((*iter)->value == value)
90         {
91             Node_t *tmp = *iter;
92             usleep(3000);
93             int_list->erase(iter);
94             delete(tmp);
95             std::cout << "remove node[" << value << "]" << std::endl;
96             return true;
97         }
98         iter++;
99     }
100
101     std::cout << "not found the value[" << value << "]" << std::endl;
102     return false;
103 }

结果如下(局部):
AddNode时:
  53 value: 5 value: 6 value: 7 value: 8 value: 9 value: 10
  54 value: 0 value: 1 value: 2 value: 3 value: 4
  55 value: 5 value: 6 value: 7 value: 8 value: 9 value: 10
  56 push successful [11]
  57 value: 0 value: 1 value: 2 value: 3 value: 4
  58 value: 5 value: 6 value: 7 value: 8 value: 9 value: 10 value: 11
  59 value: 0 value: 1 value: 2 value: 3 value: 4
  60 value: 5 value: 6 value: 7 value: 8 value: 9 value: 10 value: 11

RemoveNode时:
548 value: 1 value: 3 value: 5 value: 7 value: 9 value: 11 value: 12 value: 13 value: 14 value: 15 value: 16 value: 17 value: 18 value: 19 value: 20 value: 21 value: 22 value: 23 value: 24 value: 25 valu     e: 26 value: 27 value: 28 value: 29
549 remove node[12]
550 value: 1 value: 3 value: 5 value: 7 value: 9 value: 11 value: 13 value: 14 value: 15 value: 16 value: 17 value: 18 value: 19 value: 20 value: 21 value: 22 value: 23 value: 24 value: 25 value: 26 valu     e: 27 value: 28 value: 29
551 value: 1 value: 3 value: 5 va

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2012-07-05 16:59 |只看该作者
STL的list没锁的

论坛徽章:
0
3 [报告]
发表于 2012-07-05 17:54 |只看该作者
回复 2# hellioncu
那为什么会出现上面这种现象呢?


   

论坛徽章:
0
4 [报告]
发表于 2012-07-05 18:04 |只看该作者
应该没有加锁,不然stl还得需要知道具体的平台,因为不同平台锁的api不一样

论坛徽章:
0
5 [报告]
发表于 2012-07-05 18:11 |只看该作者
what's you want to say?

论坛徽章:
0
6 [报告]
发表于 2012-07-05 18:57 |只看该作者
为什么一定要用锁,加个标志不就可以了么

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
7 [报告]
发表于 2012-07-05 20:53 |只看该作者
没有加锁,为什么要加锁?加锁后不久限制了使用方式,库作者一般不会这样选择的,

论坛徽章:
0
8 [报告]
发表于 2012-07-05 21:09 |只看该作者
所有stl 容器对应多线程来说 都是没加锁的,要支持多线程,应该自己添加mutex

论坛徽章:
0
9 [报告]
发表于 2012-07-09 11:05 |只看该作者
Thanks all!

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
10 [报告]
发表于 2012-07-09 11:13 |只看该作者
不,c++ stl不是原子操作或者线程安全的,
c++支持这方面的逻辑,这个得用boost库了

如果希望代码简单,可以尝试学习redis
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP