LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1255|回复: 9

我想重新编译glibc-2.5使其支持linuxthreads容易吗?

[复制链接]
发表于 2007-4-13 22:27:20 | 显示全部楼层 |阅读模式
我要用的一些软件要求
LD_ASSUME_KERNEL=2.4.1
官方的邮件列表里似乎说已经彻底抛弃linuxthreads了
也就是意味着
LD_ASSUME_KERNEL=2.6.1

2.3.6好像还是支持的
可是到了2.5后肯定是不支持了
我想用debian的方式改动debian目录下的相关文件来重新打包
但是既然2.5 debian目录里已经没了linuxthreads设置,那么我应该怎么来弄呢?

对Debian的打包原理懂一点但也是平时直接拿来改改用
但glibc这种包感觉debian里的东西太多太复杂,看不懂
所以请大家给点建议

THX!
发表于 2007-4-14 07:10:43 | 显示全部楼层
己经没了就不用在这上下手了
再装个etch或别的中意发行版本,cpu够强跑下xen,机子够劲搞个virtualbox/qemu(kqemu)之类的,再差点来个双启动
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-14 09:27:42 | 显示全部楼层
唉!
看了一堆changelog
发现在experimental里从没有release的 2.4版本就把linuxthreads给drop掉了
不知道2.3.6出了什么毛病还是升级了其它的什么包
反正前几天就不能用了

正好要给glibc要打个补丁
要不就绛到2.3.6找出这个问题所在
要不要折腾一下
机器很烂
双系统是最坏的打算了
回复 支持 反对

使用道具 举报

发表于 2007-4-14 15:21:26 | 显示全部楼层
呵呵,可能还是不用折腾了
http://www.mail-archive.com/debi ... n.org/msg33178.html

真正用起来,自己要用到软件的核心功能和稳定更重要,新些旧些到无所谓
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-14 20:42:19 | 显示全部楼层
可惜啊
我是既想用sid体验天天升级的快感
又想让它兼容老的软件
能在sid下工作

我还是在想能不能把linuxthreads搞回来
我感觉etch中会不会始终用2.3.6
回复 支持 反对

使用道具 举报

发表于 2007-4-16 09:17:51 | 显示全部楼层
请教楼主一个问题,就是2.4的内核加linuxthreads,
当一个线程sleep的时候是否会导致整个进程sleep?
先谢过了。
linuxthreads的版本未知,可能也是比较老了,gcc3.4.2的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-17 17:23:00 | 显示全部楼层
楼上的,不好意思,我ù编程不Ÿ

再顶一下
看有没有人回复
回复 支持 反对

使用道具 举报

发表于 2007-4-18 21:30:37 | 显示全部楼层
Post by ailantian
请教楼主一个问题,就是2.4的内核加linuxthreads,
当一个线程sleep的时候是否会导致整个进程sleep?
先谢过了。
linuxthreads的版本未知,可能也是比较老了,gcc3.4.2的

据说当一个线程阻塞一个事件的时候,其他线程应得不到这个事件。如果这时线程sleep了,也有可能导致其他线程sleep吧。个人理解,未经实践
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-18 21:45:26 | 显示全部楼层
I have rebuilded glibc-2.5 with linuxthreads .
Testing....
回复 支持 反对

使用道具 举报

发表于 2007-4-19 09:23:17 | 显示全部楼层
Post by waq
据说当一个线程阻塞一个事件的时候,其他线程应得不到这个事件。如果这时线程sleep了,也有可能导致其他线程sleep吧。个人理解,未经实践


谢谢这位兄台:)
我试过一下,似乎是只sleep当前线程。可能是因为当初libc是以进程的方式来实现线程的
关系吧
kernel是2.4.16,gcc是3.4.2

测试程序如下,只是一个很简单的程序,不知道能不能说明问题。

  1. #include <pthread.h>
  2. #include <stdio.h>
  3. #include <time.h>
  4. #define NUM_THREADS     5

  5. void *PrintHello(void *threadid)
  6. {
  7.    printf("\n%d: Hello World sleeping now!\n", threadid);
  8.    sleep(10);
  9.    printf("\n%d: Hello World back!\n", threadid);
  10.    pthread_exit(NULL);
  11. }

  12. int main (int argc, char *argv[])
  13. {
  14.    pthread_t threads[NUM_THREADS];
  15.    int rc, t;
  16.    for(t=0; t<NUM_THREADS; t++){
  17.       printf("Creating thread %d\n", t);
  18.       rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
  19.       if (rc){
  20.          printf("ERROR; return code from pthread_create() is %d\n", rc);
  21.          exit(-1);
  22.       }
  23.    }
  24.    pthread_exit(NULL);
  25. }


复制代码



执行结果如下

  1. /bin> thread_sleep
  2. Creating thread 0

  3. 0: Hello World sleeping now!
  4. Creating thread 1

  5. 1: Hello World sleeping now!
  6. Creating thread 2

  7. 2: Hello World sleeping now!
  8. Creating thread 3

  9. 3: Hello World sleeping now!
  10. Creating thread 4

  11. 4: Hello World sleeping now!

  12. 0: Hello World back!

  13. 1: Hello World back!

  14. 2: Hello World back!

  15. 3: Hello World back!

  16. 4: Hello World back!

复制代码

上面的顺序说明不了什么问题,但是执行的时候当第一个线程sleep的时候第二个线程还在执行,而如果
是sleep整个进程的话,至少应该延迟10s才能够继续,而这里没有等待
所以当时判断不是sleep了整个进程。
如果这个方法可以的话,不知道有没有办法判断yield是yeild当前线程还是yield整个进程?


另外早期线程当中sleep不安全,后来的sleep实现都改过了。都是sleep线程的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表