Chinaunix

标题: 如何挂起一个线程 [打印本页]

作者: iamyu10    时间: 2009-04-02 22:29
提示: 作者被禁止或删除 内容自动屏蔽
作者: chrisyan    时间: 2009-04-02 22:29
原帖由 iamyu10 于 2009-4-7 15:48 发表
同志们帮帮忙吧,我只是想知道两个线程同时fgets( xxx, xxx, stdin )的时候,从stdin输入的数据能不能指定其中的某一个线程接收。。。


我觉得你有点乱了。
你问这句话的意思和“有好多个线程抢一个锁,能不能让某个线程先抢到,另一个线程第二个,再一个第三个...“不是一个意思吗?明确的答案是 不可以

你如何判断stdin的数据应该由谁来接收?你肯定有一个逻辑,要不你都不知道,程序怎么知道?
有了这个逻辑就好办了,就让一个线程来统一接收(fgets),然后按照你的逻辑来分发给处理的线程(要么是菜单,要么是线程B),分发的时候可以把数据放在同一个queue里,数据单元上做标记,指示是由哪个线程来处理,工作线程来互斥的访问这个queue。也可以是工作线程内部就有一个queue,分发线程选准是由哪个线程处理,往里扔就好了。

[ 本帖最后由 chrisyan 于 2009-4-7 16:13 编辑 ]
作者: samon_fu    时间: 2009-04-02 22:47
通过信号做。

比如,在shell下执行某程序,程序执行过程中 Ctrl+Z,挂起当前终端的这个进程。Ctrl+Z就对应到给对应进程发信号了。
作者: iamyu10    时间: 2009-04-02 22:53
提示: 作者被禁止或删除 内容自动屏蔽
作者: timespace    时间: 2009-04-02 23:30
标题: 回复 #1 iamyu10 的帖子
标准输入用一个线程select/poll就可以了吧,然后由这个线程分配任务到其它线程
作者: iamyu10    时间: 2009-04-03 09:51
提示: 作者被禁止或删除 内容自动屏蔽
作者: cugb_cat    时间: 2009-04-03 10:27
原帖由 iamyu10 于 2009-4-3 09:51 发表
呃。。。这个程序是用UDP不是TCP的,应该用不上select吧

select是对描述符的,跟udp tcp没关系
作者: iamyu10    时间: 2009-04-03 10:32
提示: 作者被禁止或删除 内容自动屏蔽
作者: alexhappy    时间: 2009-04-03 10:52
原帖由 iamyu10 于 2009-4-3 10:32 发表
那如果不用select呢,针对我这个问题,有没有什么好的解决办法?

在一个线程中得到命令(输入),然后分发给其它工作线程

PS:用select挺好
作者: KYlinux    时间: 2009-04-03 12:21
标题: 回复 #1 iamyu10 的帖子
如果你需要那样。
我觉得你设计就有问题,
你弄个互斥线程组不就OK了。
可以通过锁.或信号量。

我觉得信号量就能满足。
作者: 雨过白鹭洲    时间: 2009-04-03 12:30
就是Multiplexed I/O,同时等待多个输入源嘛
作者: mybyons    时间: 2009-04-03 13:27
互斥信号量的标准应用嘛. 两个线程共同访问同一块资源. 好好看看书吧.
作者: samon_fu    时间: 2009-04-03 19:18
如果是线程的话,用信号量做肯定是可行的了。
作者: eveson    时间: 2009-04-03 20:12
还是用中断吧
作者: iamyu10    时间: 2009-04-03 22:37
提示: 作者被禁止或删除 内容自动屏蔽
作者: iamyu10    时间: 2009-04-03 22:37
提示: 作者被禁止或删除 内容自动屏蔽
作者: samon_fu    时间: 2009-04-06 01:07
那你就让接收键盘输入的线程做个switch如何?
对从键盘获取的内容做个判断,如果应该是另外一个线程获得的,通过信号+缓冲区一起将对应键盘数据送过去?

不知道大家还有没有更好的办法~~
作者: msingle    时间: 2009-04-06 11:40
提示: 作者被禁止或删除 内容自动屏蔽
作者: iamyu10    时间: 2009-04-07 09:42
提示: 作者被禁止或删除 内容自动屏蔽
作者: reiase    时间: 2009-04-07 10:11
明显设计有问题,这个问题应当基于函数设计,而不是基于线程。
这样设计:写一堆处理函数,然后,线程A捕获输入,如果发现输入需要后台处理,那么就开个线程B在后台调用处理函数处理,如果输入的处理还需要用户输入数据,那么就在线程A里调用处理函数处理。
作者: iamyu10    时间: 2009-04-07 10:15
提示: 作者被禁止或删除 内容自动屏蔽
作者: iamyu10    时间: 2009-04-07 10:27
提示: 作者被禁止或删除 内容自动屏蔽
作者: alexhappy    时间: 2009-04-07 10:33
原帖由 iamyu10 于 2009-4-7 10:27 发表


谢谢帮助啊,不过问题不是这样的,线程B并不是由用户在标准输入输入什么而创建的,而是远程另外一个用户建立TCP连接而创建的。这样AB两个线程就会同时接收标准输入的内容。是这个问题

如我前面所说,只用一个线程接收输入,然后分发给其它线程,你这样做明显不当
作者: reiase    时间: 2009-04-07 10:33
原帖由 iamyu10 于 2009-4-7 10:27 发表


谢谢帮助啊,不过问题不是这样的,线程B并不是由用户在标准输入输入什么而创建的,而是远程另外一个用户建立TCP连接而创建的。这样AB两个线程就会同时接收标准输入的内容。是这个问题


这样的话,我觉得你应当参考一下ftp协议和http协议的设计,要么把两个线程的通信分开,要么制定一个通信协议来区分数据是发给A还是发给B的
作者: reiase    时间: 2009-04-07 10:34
原帖由 alexhappy 于 2009-4-7 10:33 发表

如我前面所说,只用一个线程接收输入,然后分发给其它线程,你这样做明显不当


用http里表单那种设计兴许能够解决问题
作者: iamyu10    时间: 2009-04-07 10:37
提示: 作者被禁止或删除 内容自动屏蔽
作者: reiase    时间: 2009-04-07 10:46
原帖由 iamyu10 于 2009-4-7 10:37 发表


那请问,接收所有标准输入的那个线程,怎么判断得到的是菜单选项还是某项功能中要求用户输入的数据呢?

如果仅凭输入的内容来判断的话,刚才我给其他朋友回复的:
  “不过我想可能单凭输入的内容来判断 ...


设计协议阿,你看你在网站上,页面里那些个菜单,选项是怎么处理的?和你的要求像不像?去研究下Web协议吧
作者: iamyu10    时间: 2009-04-07 11:20
提示: 作者被禁止或删除 内容自动屏蔽
作者: alexhappy    时间: 2009-04-07 12:28
标题: 回复 #27 iamyu10 的帖子
那这样办:让用户决定自己的命令该如何处理,比如在输入内容前加个a:表示给a处理
又或者来个超时,某个时间以前输入给a,否则输入给b

PS:如果这样的话,那也不必用多线程了
作者: iamyu10    时间: 2009-04-07 12:46
提示: 作者被禁止或删除 内容自动屏蔽
作者: alexhappy    时间: 2009-04-07 12:54
指定优先级有什么用啊,那如果你真的想这样还不如用锁+条件变量。。。

PS:你的逻辑貌似已经混乱,或者你自己不觉地已经走进死胡同里了
作者: iamyu10    时间: 2009-04-07 13:07
提示: 作者被禁止或删除 内容自动屏蔽
作者: reiase    时间: 2009-04-07 13:46
原帖由 iamyu10 于 2009-4-7 11:20 发表



网站上的那些下拉菜单选项什么的,都是那些固定的选项,固定的值,而我这个不是web程序,只是单纯的命令行的形式,所以说无法预先知道用户会输入什么


...无语
作者: iamyu10    时间: 2009-04-07 15:48
提示: 作者被禁止或删除 内容自动屏蔽
作者: linuxsun.cn    时间: 2009-04-11 10:12
学习学习~




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2