当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 8 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : pthread_create创建多线程之间的数据共享
帖子发表于 : 2009-05-17 13:51 

注册: 2008-07-10 15:08
帖子: 448
送出感谢: 0 次
接收感谢: 0 次
在主函数中定义了一个list<int> intList;
然后创建了两个线程
pthread_create(,,func1,)
pthread_create(,,func2,)
将list分别传递给两个线程函数
在一个线程中向list中添加数据,令一个线程从list读取数据,
萨两个线程不能共享这个list,?????


页首
 用户资料  
 
2 楼 
 文章标题 : Re: pthread_create创建多线程之间的数据共享
帖子发表于 : 2009-05-17 14:39 
头像

注册: 2007-03-08 10:47
帖子: 262
送出感谢: 0 次
接收感谢: 0 次
默认都是共享的,但是要注意线程同步。


_________________
My blog: hsquared66.blogspot.com


页首
 用户资料  
 
3 楼 
 文章标题 : Re: pthread_create创建多线程之间的数据共享
帖子发表于 : 2009-05-18 14:29 

注册: 2008-07-10 15:08
帖子: 448
送出感谢: 0 次
接收感谢: 0 次
是的,默认清况下是共享的
还有一个问题
我在一个下线程中不断的添加数据,在另一个线程中不断的判断队列是否为空?
用的是list.empty()
调用这个函数的时候是不是也要加锁,测试看不加也能判断队列是不是为空,但是,出现了这种情况
:因为我每添加一个都打印一条消息,没判断一个是否为空也打印一条消息
一开始还没有向队列中添加数据时,一直输出队列为空的消息,真要是队列中 有了数据在打印出有数据之前,我的判断队列为空的函数就报告出,队列不为空了
鉴于这种情况是不是应该加锁?


页首
 用户资料  
 
4 楼 
 文章标题 : Re: pthread_create创建多线程之间的数据共享
帖子发表于 : 2009-05-18 19:54 
头像

注册: 2007-03-08 10:47
帖子: 262
送出感谢: 0 次
接收感谢: 0 次
哥们,具体的实践我不一定比你熟,不过我觉得你这种情况好像不必加锁吧,list.empty()具体实现我不清楚,不过好像不会写变量的,不过如果另一个线程要输出(打印)并删除变量,最好加互斥锁。
具体情况你自己看吧。不过加锁是为了同步,比如说一个线程都要写一个变量,最简单比如自增操作,第一个线程读出1,然后写回2;第二个线程读出2,然后写回3;此时必须加锁,如果不加,可能第一个线程写之前第二个线程就读了,读到的还是1,写回去的也是2,就不对了(当然两个线程谁先谁后不一定的,这只是个例子)。当然,关于锁的应用比这复杂的多,你可以看看并行计算和多线程方面的资料,时间充裕的话,学一些理论也是很有帮助的。
还有你这个应该是用计数信号量来实现吧?没必要不断判断吧,个人以为写成阻塞的可能更好些。


_________________
My blog: hsquared66.blogspot.com


页首
 用户资料  
 
5 楼 
 文章标题 : Re: pthread_create创建多线程之间的数据共享
帖子发表于 : 2009-05-18 19:58 
头像

注册: 2006-05-20 14:03
帖子: 898
送出感谢: 0 次
接收感谢: 0 次
我一般用sem_wait和sem_post,感觉这种方式更适合这种队列的操作


页首
 用户资料  
 
6 楼 
 文章标题 : Re: pthread_create创建多线程之间的数据共享
帖子发表于 : 2009-05-18 21:46 

注册: 2006-09-11 22:47
帖子: 2841
送出感谢: 0 次
接收感谢: 4
链表空并不是原子操作,因此需要加锁,同时加锁所有的写操作。当然对于你这里的特定情况,不加锁或许也可行。

但是最好直接使用信号、消息等进程间通信机制来通知另一进程相关事件,这样更可靠些。

除非是对效率要求极高的情形,一般不建议两个线程使用全局量进行事务调度。——因为绝大多数程序员没有足够的能力把握好这之间的关系。使用各种进程间通信机制要可靠很多。


页首
 用户资料  
 
7 楼 
 文章标题 : Re: pthread_create创建多线程之间的数据共享
帖子发表于 : 2009-05-19 15:04 

注册: 2008-07-10 15:08
帖子: 448
送出感谢: 0 次
接收感谢: 0 次
楼上各位说的都是金玉良言,谢谢,
确实有的时候,操作起来理论要结合实际。
poet,
说的最好直接使用信号。消息等进程间通信机制来通知另一个线程相关事件,这更可靠??
再我温习信号,消息前,想问问,为什么这更可靠??互斥锁哪???


页首
 用户资料  
 
8 楼 
 文章标题 : Re: pthread_create创建多线程之间的数据共享
帖子发表于 : 2009-05-20 13:04 

注册: 2006-09-11 22:47
帖子: 2841
送出感谢: 0 次
接收感谢: 4
weihua2008 写道:
楼上各位说的都是金玉良言,谢谢,
确实有的时候,操作起来理论要结合实际。
poet,
说的最好直接使用信号。消息等进程间通信机制来通知另一个线程相关事件,这更可靠??
再我温习信号,消息前,想问问,为什么这更可靠??互斥锁哪???


因为你是使用一个真实存在的逻辑概念:信号,或者消息,这个机制本身是为进程间通信设计的。

对于使用全局量访问链表而言,你需要知道读写链表所做的所有具体操作,来搞清楚是否需要加锁。通常而言对于C++你很难搞清楚具体究竟做了哪些事情(C++会在背后做很多事情,而C语言就不同),所以很难把握线程共享全局量时可能出现的问题。

实际上我们只有在音视频解码等对实时性要求极高(视频解码需要在小于40ms之内完整解出一帧数据)的场合才需要使用多线程共享变量的方式同步,对于一般的非实时性事务性操作,不但不建议使用全局变量,甚至都不建议使用线程,因为进程分割是 Linux 编程中比较推荐的方式。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 8 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译