Chinaunix

标题: Linux有没有线程变量,是否可以线程级重定向I/O? [打印本页]

作者: Cyberman.Wu    时间: 2013-01-04 17:53
标题: Linux有没有线程变量,是否可以线程级重定向I/O?
以前在VxWorks中有一种任务变量(它的一个任务类似于一个线程),在移植一些使用全局变量的应用到多任务时会方便一些,但Linux似乎没有找到类似的机制?
另外,Linux中的I/O输出(printf)是不是只能在进程级别上重定向?
作者: dinglong08    时间: 2013-01-04 18:28
linux的线程私有变量是有的,你可以看看我的blog,但是i/o就不清楚了

作者: Cyberman.Wu    时间: 2013-01-05 08:52
回复 2# dinglong08


    blog在哪看?好像有一个pthread_setspecific,但这个还是和原来VxWorks的机制完全不同的,对于vx,可以不修改使用全局变量的代码,甚至是一个不能修改代码的库,也可以搞定。
作者: dinglong08    时间: 2013-01-05 12:12
http://blog.chinaunix.net/uid-26733228-id-3309580.html
我说的是线程私有变量,对代码来说就是用同样的变量名(同样的代码流程),但是值是各线程自己的
vx我就不熟悉了)
作者: Cyberman.Wu    时间: 2013-01-05 12:32
回复 4# dinglong08


    这个用法我已经知道了,还是没那么方便,无法就是用一个统一的key,再得到一个各线程唯一值。如果说有一个普通的全局问题,这个是需要修改代码才能达到可以多线程不干扰的;而对于不能修改代码的情况,就没办法了。

VxWorks的任务变量实际上是把变量的地址注册到内核中,在任务切换走时保存原来的值,切换回来再恢复出来。这种方式也有它自身的限制,一个是任务变量越多,任务切换时间越长;二是如果全局问题如果是一个大的数据结构,不修改代码也是搞不定的。
作者: smalloc    时间: 2013-01-05 14:46
linuxthread模型信号可以群发也可以独立。
I/O是指定每进程的0,1,2号文件描述符?
NPTL模型更符合POSIX标准,原则上POSIX规定信号是进程的,所以IO也应该进程的。所以不同线程的IO分离是不允许的。

另听说LZ在自己搞项目,求带路。
作者: smalloc    时间: 2013-01-05 15:30
所谓重定向其实就是dup2实现的。本质上就是将固定的文件描述符号关联新的文件。线程是共享文件描述符表的。
作者: dinglong08    时间: 2013-01-05 17:13
使用线程局部变量的时候,这个 key 对所用的线程来说都是一样的啊,都用的是同一个变量,没理解你的意思
作者: Cyberman.Wu    时间: 2013-01-07 17:18
回复 8# dinglong08


    是的,key是同一个变量,在能修改代码的情况下这个是可以的。我指的是有时候第三方的库/模块中有一个全局变量,没办法修改代码的情况。
作者: Cyberman.Wu    时间: 2013-01-07 17:21
回复 6# smalloc


    我没看Linux中线程的实现,不过估计应该是不行的。VxWorks实际上是在任务结构中有三个固定的“任务变量”,可以按任务设置stdin/stdout/stderr,这个是它的特殊实现,在没有进程的情况下实现不同任务可以独立的定向I/O。

你听谁说我在自己做项目?
作者: smalloc    时间: 2013-01-08 11:16
回复 10# Cyberman.Wu


    prolj 还是flw2,忘记了。10年底的事。
作者: cwlalx    时间: 2013-01-26 14:15
回复 1# Cyberman.Wu


    线程用的是进程的文件描述符,如果你在线程中重定向,那么进程中的文件描述符就会发生变化,除非你有办法将线程和进程的文件描述符分离开(不可能的)




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