当前位置:  技术问答>linux和unix

高手请进:多线程访问同一链表,需不需要加锁?

    来源: 互联网  发布时间:2015-09-24

    本文导语:  多线程访问同一链表(准确的说应是stl的map):     1.只是读操作,并且不会同时访问同一个元素。     2.没有删除操作,有添加。          考虑到多线程的效率,我不想加锁,请教高手,会不会出问题?   ...

多线程访问同一链表(准确的说应是stl的map):
    1.只是读操作,并且不会同时访问同一个元素。
    2.没有删除操作,有添加。
     
   考虑到多线程的效率,我不想加锁,请教高手,会不会出问题?
   欢迎有过经验的高手指正!

|
我觉得这个问题不能孤立的看,还要看你是怎么设计的,会不会同时读同一个元素都无关紧要。主要的是你有添加操作。添加操作不加锁会有两个问题,1是两个线程同时添加,2是添加过程中另外一个线程读。加不加锁就看你怎么处理这两个问题。
如果你只有一个线程添加节点,问题1就不存在。如果你的添加节点只是一个指针的赋值操作,我觉得问题2也不是大问题,当然你可以争论说一个赋值操作转化成机器码也有很多操作,但是我们当年进程间通信用的循环列表指针用了那么多年好像也没出什么问题。
我想这样也回答了你最后的问题。如果你要解决问题1,你就加一个写的互斥锁,如果你认为问题2同样要解决你就给读加一个共享锁。如果你认为都不是问题,就不用加锁。

|
我个人认为应该加锁,别的不说,主要是第二条里面的添加操作,你是否考虑过在链表的同一个位置有两个线程进行添加操作的情况?
假如说是单向链表,A->B,现在在A,B中间加上C,A->C,temp->B,其中temp为临时变量,那么如果现在另外一个线程来添加的话,怎么办?如果是在A->C中间,或者其他位置进行添加操作还好说,但是如果是在C之后添加,会出现什么情况,你可以考虑一下。现在C的后续指针还没有赋值啊。
我在这里只是说说我自己的想法,不一定正确,希望你批判的看待。而且我不是高手,呵呵,但是我非常喜欢和大家一起交流。
对于性能的追求是应该的,但是我认为这应该是在保证正确性的前提下来做的。
祝你好运。

|
最好加锁
你在链表上添加节点
实际上已经执行写操作了
肯定有的节点的next指针会变化
加锁也不是很麻烦啊

|
对链表有读操作应该就有遍历吧,那是如何保证“不会同时访问同一个元素”的呢?
对于单、不循环的链表,如果a,b两个线程都要添加节点,代码都是:
new好了一个节点,填好数据,p也遍历到指向了尾,就差给p->next赋值了,线程a先做了这个赋值,认为节点a已被添加,可马上就被切换,线程b也做赋值,这就...

|
我的一个程序是读没加锁,写加了锁,不过我也不知道这会不会有问题

|
如果是只读访问,是不需要加锁的。

    
 
 

您可能感兴趣的文章:

  • 一个线程问题,很困惑,高手帮个忙
  • 网络通讯和多线程问题 请高手相助!献上100分
  • 我只有这么多分了,请多线程高手帮一下!!!!!!!
  • Linux 多线程出现段错误 高手请进啊!
  • 请教高手,线程问题,怎样暂停或杀掉多线程?
  • 高手请进:linux 多线程占用内存问题
  • Linux线程阻塞问题 高手请进
  • 关于线程的问题,还请各位高手们能帮着看看
  • 入门,请教线程编程的问题,请各路高手帮帮忙
  • 复杂的线程同步问题,请教高手
  • 高手请看过来,我有些问题,我是新手.关于线程的!
  • 有没有使用过Linux下线程池技术的高手,请为我指点迷津!!!
  • 请linux下多线程编程的高手进来下
  • 急需关于linux多线程的代码工程实例-高手请进啊
  • 请问关于socket客户端因事件启动新线程的问题.高手请进
  • 请高手指点,多线程程序,如何调试找出 SIGSGEV 发生的位置?
  • 问个管理线程的问题-高手赐教
  • 请问高手LInux 下的进程、线程的切换具体是如何实现的?
  • Liunx多进程,多线程编程高手进来
  • 高手救命,linux下C++,多线程问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 高手求救,在windows下访问linux服务器时使用如\192.168.100.1,但是访问失败,问在linux上要怎么设置啊
  • 在LINUX下无法访问WIN2000下的WEB页面,高手指教!
  • ○○●○○●有些担心,请高手指点,我公司SB一定要用session登录网站,日访问5000以上,我该怎么办?
  • 有哪位高手知道如何通过DOS的命令行访问网络中其他机器的共享目录
  • 急需关于linux多线程的代码工程实例-高手请进啊 iis7站长之家
  • 装了proftpd,可是只能从本机访问,请教高手
  • 请教高手: linux c如何远程访问windows下的oracle数据库?
  • 请教高手,Redhat linux 7.1下如何访问同一硬盘的win98分区?
  • 请高手指点:怎样在Linux里访问格式化成fat32的移动硬盘,通过USB接口?
  • 请问哪位高手能指导小弟如何对一个DBF格式的表单访问,具体操作?高分在线等候!急!!!!!!
  • 高手请教:在Linux下怎样访问Win2000下的FAT32系统?
  • 访问内存错误的问题。请高手帮我找下原因。。
  • 如何在windows中访问linux分区?高手赐教
  • 一个关于JSP访问文本的问题,请高手看看。总是出错!
  • 200分!!嵌入式Linux下通过TCP访问服务器,Socket被服务器重置,错误号104??(高手请进)解决后加送100分!!!
  • 请教高手:如何在module中访问sys_call_table
  • [高手进]海量数据网络通讯,当访问请求达3万以上时,出现coredump错误。一般是什么原因?
  • 请教高手:远程访问EJB的一个问题??(急)
  • 数据库访问函数的调用问题--100分寻找高手救援,分数不够,可以在加,在线急,急,急,急。。。。。
  • 关于互斥访问共享变量的问题(菜鸟求高手)
  • 高手,高手,高高手请进!
  • 有熟悉EXIM的高手高手么??
  • to 高手:学java应该怎样一步步学习,从菜鸟到高手.
  • 高分请高手,高手定能解决
  • 请问高手在linux中用什么命令可以做linux的启动盘???在等待高手??
  • 有高手研究Agent++麽?里面有个thread.h,蛮难读的,请高手指点
  • 难道高手区里的人就是高手?
  • 在dos下用bc31挑战高手******开发mssql程序,连接时报link err:undefined symbol GETNOTE in module DBEXTERN?(挑战高手)
  • 真正的linux高手,请看过来,看你符合高手标准不?
  • 难道这没有高手吗?难道这没有乐于助人的高手?(高分酬谢62+50+50)
  • 关于我对linux高手用yum,非高手用源码的理由


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3