thread-编译MySQL时Linux-not-found问题与解决 (threadlocal)

教程大全 2025-07-14 17:48:28 浏览

在FC6系统中从源码安装时遇到问题如下,提示Linux thread not found的错误,代码如下:

在网上随便搜一下关键字“Linuxthreads was not found”可以找到很多相关的帖子,但大多都没有提供完整解决方案。

下面来分析一下上面的出错情况,并就此提供一个解决方案。从上面的出错可以很明显的看出是说系统缺少线程库。没有线程,Linux可以运行吗?呵呵,那当然不行。既然没有linuxthread那现在用的是什么呢?

答案是。

作为去除过时的LinuxThreads 库的一个步骤,在 Fedora Core 5 test1 中编译和连接的代码现在自动使用NPTL头文件和库。在过去的版本中,从 Red Hat Linux 9 开始,默认的线程模型是LnuxThreads,因为接口是最通用的。NPTL 接口的优点在于,线程取消的处理更快 (使用 -fexception 参数时,即使在 C 代码中)。现在附加的接口也已可用,不需要特殊的编译器和连接器参数。

下面言归正转,怎样解决?

可以修改程序去支持NPTL,也可以在编译时加上对原有thread库的支持。我选择了后者,这样可以不动MySql的源代码。在mysql手册中搜关键字thread,可以查到在Chapter2.Installing and Upgrading MySQL。

2.8.5. MIT-pthreads Notes

从上可以看出:只要下到mit-thread源码就可以了。但不知道为什么官方网站上已经没有下了的了(我又找了一个官网的镜像还是没有,郁闷ing)。再仔细看一下上面,只是将线程源码放到MySql源码目录的根目录下以mit-pthreads命名的目录。官方没有自己去下一个也是一样的,只要解压后放到上述位置就可了。

于是去下了一个pthread源码包,解压放到相应位置。

再执行:

就顺利通过了。

附:NPTL与 LinuxThreads 相比的优点

NPTL 没有使用管理线程。管理线程的一些需求,例如向作为进程一部分的所有线程发送终止信号,是并不需要的;因为内核本身就可以实现这些功能。内核还会处理每个线程堆栈所使用的内存的回收工作。它甚至还通过在清除父线程之前进行等待,从而实现对所有线程结束的管理,这样可以避免僵尸进程的问题。由于 NPTL 没有使用管理线程,因此其线程模型在 NUMA 和 SMP 系统上具有更好的可伸缩性和同步机制。

使用 NPTL 线程库与新内核实现,就可以避免使用信号来对线程进行同步了。为了这个目的,NPTL 引入了一种名为 futex 的新机制。futex 在共享内存区域上进行工作,因此可以在进程之间进行共享,这样就可以提供进程间 POSIX 同步机制。我们也可以在进程之间共享一个 futex。这种行为使得进程间同步成为可能。实际上,NPTL 包含了一个 PTHREAD_PROCESS_SHARED 宏,使得开发人员可以让用户级进程在不同进程的线程之间共享互斥锁。

由于 NPTL 是 POSIX 兼容的,因此它对信号的处理是按照每进程的原则进行的;getpid() 会为所有的线程返回相同的进程 ID。例如,如果发送了 SIGSTOP 信号,那么整个进程都会停止;使用 LinuxThreads,只有接收到这个信号的线程才会停止。这样可以在基于 NPTL 的应用程序上更好地利用调试器,例如 GDB。

found问题与解决

由于在 NPTL 中所有线程都具有一个父进程,因此对父进程汇报的资源使用情况(例如 CPU 和内存百分比)都是对整个进程进行统计的,而不是对一个线程进行统计的。

NPTL 线程库所引入的一个实现特性是对 ABI(应用程序二进制接口)的支持。这帮助实现了与 LinuxThreads 的向后兼容性。

【编辑推荐


Exception in thread "main" Java.lang.NoClasSDEfFoundError: hello/class?

错误是告诉你,找不到文件 你的程序没问题,可能是因为你环境变量的设置有问题 我告诉你我的,你对照修改一下,如果不是这个原因,你在想别的办法。 不过最可能的就是环境变量配置有问题。 classpath为 .;E:\j2sdk1.4.2_04\lib\;E:\j2sdk1.4.2_04\lib\ path为E:\j2sdk1.4.2_04\bin; java_home为E:\Java\j2sdk1.4.2_04 环境变量如果设置正确,你的程序肯定能运行,如果不配置环境变量,那么把你的JAVA文件复制到bin目录下去编译,然后运行,如果还不行,那你就要重装JDK了! 我的方法你都弄一下,如果不行你踩我!!!! 补充:classpath他的路径前必须有 点 和 分号 .; 就是这个!! 新补充:能帮到你真的很高兴! 对不起,确实是dt不是jt,是我打错了! 但运行程序没关系的!但还是写正确的好,要不怕有麻烦,呵呵,谢谢peizhengfen! 还有回答一下楼主的问题 classpath是用来使编译程序能找到用户定义类和系统类所在的包,需要将用户类所在的目录和系统类所在的包放入环境变量中,路径中的点“.”就表示当前用户类所在的目录(当前目录)而确定和就是指定系统类!只有写全了才能实现classpath的功能!不过说句实在话,到目前为止,我还没看到过哪本书上环境变量向你说的那样配置,真的,如果有,也肯定不是JDK1.4.2,也许版本比他高吧!不过你记住了,这么配置对你以后应用集成开发软件有好处,他能很方便的找到你的JDK,加快了程序的运行效率!我的能力有限,希望我说的能帮到你!

ORACLE 包调用出错ORA-06550: 第 1 行, 第 7 列

ORA-: 第 1 行, 第 7 列: PLS-: 调用 RPT_RATE_EVECTION 时参数个数或类型错误 ORA-: 第 1 行, 第 7 列: PL/SQL: Statement ignored 这里不是说了吗 RPT_RATE_EVECTION 参数个数或者类型错误 你看看这个包里面的参数类型和你定义的参数类型是否一致,另外你定义的参数个数和包里面的参数个数是否一致

Err5:Error finding VFLOPLY.SYS; Err8:Fake Floppy driver not found

第一种方法,这样改你的 boot loader] timeout=5 default=multi(0)disk(0)rdisk(0)Partition(1)\WINDOWS [operating systems] multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=Microsoft Windows XP Professional /noexecute=optin /fastdetect _______________________ 第一种方法可以正常启动xp,但是没有ghost了。 第二种方法,重装一键ghost 你的错误信息是缺少虚拟软驱的文件,但是明显你原来用了一键ghost 因为ghldr就是用来加载ghost的。 现在它被毁了,重装就好了。 ———————————————————— 一键ghost没有装好吧?卸干净了再试试。

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐