免费注册 查看新帖 |

Chinaunix

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

[C] 关于posix线程的几个问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-29 14:20 |只看该作者 |倒序浏览
对Posix线程有初步了解,但还有不少疑问,希望大家指点:

1. 线程如何管理?线程会不会异常退出?如果会,若某个合态方式运行的线程异常结束后能被pthread_join捕捉到,那么能否在捕捉到完成清理工作之后重新再创建相同功能的线程呢?

2. 一个线程依赖于其他多个线程中的共享数据时,例如我现在需要用A、B、C、D四个线程分别处理数据a, b, c, d,而在E线程中需要每隔一定时间集中同时处理数据a,b,c,d。这时,如何进行互斥和同步处理?

如果使用互斥锁和条件变量,在E线程操作完毕后,发送signal通知各阻塞线程继续运行;那么在E线程时间到需要处理数据时如何通知其他占有锁的四个线程解锁呢?
而且如果分别对a,b,c,d使用锁,如果这四拔锁不能在该时刻均释放,可能会导致E线程一直获得不了锁,无法进行数据操作的可能性。这种情况是不是需要使用线程中的信号机制来解决?

[ 本帖最后由 什么名 于 2008-10-29 14:23 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-10-29 14:49 |只看该作者
1,线程是你自己来管理的,怎么管理?那得看你自己
线程当然可能会异常退出,而且你当然也可以在这之后创建一个功能相同的线程
2,将abcd设为全局的并用一个读写锁锁住,然后在每个线程中设置相应的信号处理函数,在信号处理函数中释放掉自己所占有的(读)锁,在信号处理结束之后再重新获取,此时E就去获取(写)锁

论坛徽章:
0
3 [报告]
发表于 2008-10-29 16:01 |只看该作者
原帖由 alexhappy 于 2008-10-29 14:49 发表
1,线程是你自己来管理的,怎么管理?那得看你自己
线程当然可能会异常退出,而且你当然也可以在这之后创建一个功能相同的线程

2,将abcd设为全局的并用一个读写锁锁住,然后在每个线程中设置相应的信号处理函 ...


1.  请问怎末监视异常退出的线程?
2.  使用一个读写锁无法使得A、B、C、D并发,A、B、C、D分别对数据a,b,c,d有读写操作。

[ 本帖最后由 什么名 于 2008-10-29 16:03 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2008-10-29 16:22 |只看该作者
1,线程异常退出很有可能会让进程也异常退出
2,这说明你的设计有问题了,不过,如你实在想用这中设计,可以这样,(刚才我说错了,信号处理函数在所有线程中是共享的,而不用一一设置),E线程需要处理abcd时就发出信号,在信号处理函数中对abcd解锁,然后E就可以获取锁处理了,完了之后就解锁,ABCD再去处理。。。。汗

论坛徽章:
0
5 [报告]
发表于 2008-10-29 18:59 |只看该作者
原帖由 alexhappy 于 2008-10-29 16:22 发表
1,线程异常退出很有可能会让进程也异常退出
2,这说明你的设计有问题了,不过,如你实在想用这中设计,可以这样,(刚才我说错了,信号处理函数在所有线程中是共享的,而不用一一设置),E线程需要处理abcd时 ...

谢谢你的回答。
但是我感觉第一个问题你是在回答我有异常的可能,而不是回答如何去处理监视并处理(重新创建)这些异常线程。
第二个问题,我觉得在线程中引入信号很复杂,不知道有没有什么好的解决方案。

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
6 [报告]
发表于 2008-10-29 21:21 |只看该作者
线程最好不要引入信号,比较容易出错

论坛徽章:
0
7 [报告]
发表于 2008-10-30 08:59 |只看该作者
原帖由 什么名 于 2008-10-29 18:59 发表

谢谢你的回答。
但是我感觉第一个问题你是在回答我有异常的可能,而不是回答如何去处理监视并处理(重新创建)这些异常线程。
第二个问题,我觉得在线程中引入信号很复杂,不知道有没有什么好的解决方案。

我的意思是,线程异常极有可能导致进程的异常终止,so,似乎没什么好的办法解决这个问题,不过,真想监视的话,可以采取让它们之间互相“通信”,什么时候该发生的“通信”没有发生,那么可理解为线程有点“异常”,不过,一般情况下,你的进程似乎也会挂的,似乎此时监视也没什么作用或者说是意义吧?那么真想得到监视信息的话,可以将信息输出到日志中解决。。。。汗
线程引入信号自然是麻烦很多了,而且容易出错,所以我说你的设计有问题,如果只用同步的话,似乎效率和可行性也不会太好,那么你就将abcd放入一个锁中,配合条件变量。。。。。汗

论坛徽章:
0
8 [报告]
发表于 2008-10-30 10:13 |只看该作者
原帖由 alexhappy 于 2008-10-30 08:59 发表

我的意思是,线程异常极有可能导致进程的异常终止,so,似乎没什么好的办法解决这个问题,不过,真想监视的话,可以采取让它们之间互相“通信”,什么时候该发生的“通信”没有发生,那么可理解为线程有点“异 ...

谢谢你!哈哈,这位老兄太有意思了,每段话之后,四个圈圈一个汗,哈哈 。。。。汗

只是设计是基于应用原型的,暂时没想到修正办法。

如果采取一把锁,A、B、C、D 四个线程来竞争一把锁进行保护各自的数据a、b、c、d,
缺点是 A、B、C、D 不能并发分别处理数据a、b、c、d,而他们之间本来没有同步关系,
这样处理是否欠妥??

线程 E 需要一起操作数据a、b、c、d,它依赖于a、b、c、d的锁均解开,采用一把锁倒好,
不会出现其中线程A、B、C、D有锁未解开的情况。

似乎很矛盾,不用信号两者没法兼顾??没有出路????

论坛徽章:
0
9 [报告]
发表于 2008-10-30 10:23 |只看该作者
原帖由 chenzhanyiczy 于 2008-10-29 21:21 发表
线程最好不要引入信号,比较容易出错



多线程中使用信号量的情况很常见啊。

论坛徽章:
0
10 [报告]
发表于 2008-10-30 10:56 |只看该作者
原帖由 nicozhou 于 2008-10-30 10:23 发表



多线程中使用信号量的情况很常见啊。

信号 非 信号量
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP