多线程下std::list的遍历与push

原创 2011年05月30日 15:49:00

一个线程往list中push数据,一个线程遍历该list然后进行操作。没有试验,我猜测可能会有多线程安全问题。

解决办法,如果对遍历的数据进行加锁,可能性能有损失。我使用了如下这种方法,记录在案。

 

使用一个临时的list,比如,

std::list<int> readables; //遍历时使用的

std::list<int> readables_tmp; //push数据的时候使用的。在遍历之前,再将此list中的数据移到readables中去。

 

插入线程中:

 

{

CAutoLock( &cs );

readables_tmp.push_back( index );

}

 

 

遍历线程中:

{

{

CAutoLock( &cs );

copy( readables_tmp.begin(), readables_tmp.end(),back_inserter( readables ) );

readables_tmp.clear();

}

for( readables.begin();readables.end();......)

{

}

}

 

因为只是将新增的临时list中的数据移动到readables中,所以时间比较快。应该有效率提升。

 

 

 

 

STL的多线程安全问题

。以下列方式同步基本上可以做到线程安全的容器(就是在有写操作的情况下仍能保证安全)。 1.每次调用容器的成员函数的期间需要锁定。 2.每个容器容器返回迭代器的生存期需要锁定。 3.每个容器在...
  • zdl1016
  • zdl1016
  • 2010年10月14日 17:36
  • 11669

C++并发实战18: 线程安全的查找表和链表

经常遇见根据关键字查找内容的应用如DNS查询,标准库的std::map系列可供选择,但是它们是非线程安全的,一个线程安全的查找表实现如下,其主要是通过hash函数将各个key分散到具体的bucket中...
  • liuxuejiang158
  • liuxuejiang158
  • 2013年12月25日 14:22
  • 3771

C++多线程学习---线程间的共享数据

多线程间的共享数据如果不加以约束是有问题的。最简单的方法就是对数据结构采用某种保护机制,通俗的表达就是: 确保只有进行修改的线程才能看到不变量被破坏时的中间状态。从其他访问线程的角度来看,修改不是已经...
  • PENGH56
  • PENGH56
  • 2016年11月21日 15:02
  • 2554

C++中两个线程用同一个list进行数据传递

c++ 多线程通过list传递数据
  • baidu_15303991
  • baidu_15303991
  • 2017年07月12日 15:18
  • 387

如何利用iOS多核高效遍历数组.

我们知道遍历数组是一个相对耗时的操作,而同时手机的核是越来越多,所以我们需要充分利用iOS多核的作用. 特别是在遍历操作中还有其他耗时操作.像我们平时直接遍历数组的操作 for (NSIn...
  • petyou123
  • petyou123
  • 2016年07月26日 16:17
  • 1000

C++11:基于std::queue和std::mutex构建一个线程安全的队列

C++中的模板std::queue提供了一个队列容器,但这个容器并不是线程安全的,如果在多线程环境下使用队列,它是不能直接拿来用的。 基于它做一个线程安全的队列也并不复杂。基本的原理就是用std::...
  • 10km
  • 10km
  • 2016年07月29日 19:18
  • 4706

多线程笔试面试总结(一)

主要题目类型:1.概念性题目 2,选择性题目,3.简答或综合性题目 一.概念性问答题 1. 线程的基本概念、线程的基本状态及状态之间的关系? 解答: 线程是一个进程内部的一个控...
  • quentain
  • quentain
  • 2016年05月25日 21:21
  • 681

GTK 多线程例子

 GTK线程的简单使用与线程中更新图形界面   1)线程的简单使用,通过一个简单例子来说明(能运行)   编译命令: gcc   `pkg-config gtk+-2.0 --cfla...
  • qq61394323
  • qq61394323
  • 2014年07月19日 17:01
  • 2376

stl的vector和list的push_back效率比较

今天遇到一个问题,在与同事讨论问题的时候,提到vector的push_back是否很快的时候。自己不假思索的认为,如果没有随机读的需求的话,换成链表的方式,会有更快的插入效率。但只是根据一些经验性的做...
  • dreamvyps
  • dreamvyps
  • 2017年02月16日 22:02
  • 1660

STL::list 遍历元素方法

void printit(DAT vals) {     printf("ss= %d\n",vals.val); }  list mylist;  DAT mydat; ...
  • liujiayu2
  • liujiayu2
  • 2015年03月10日 14:58
  • 1336
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程下std::list的遍历与push
举报原因:
原因补充:

(最多只允许输入30个字)