編譯MySQL時(shí)Linux thread not found問(wèn)題與解決
在FC6系統(tǒng)中從源碼安裝MySQL時(shí)遇到問(wèn)題如下,提示Linux thread not found的錯(cuò)誤,代碼如下:
- #./configure --prefix=/usr/local/mysql
- …
- …
- checking "LinuxThreads"... "Not found"
- configure: error: This is a linux system and Linuxthreads was not found. On linux Linuxthreads should be used.
- Please install Linuxthreads (or a new glibc) and try again.
- See the Installation chapter in the Reference Manual for more information.
在網(wǎng)上隨便搜一下關(guān)鍵字“Linuxthreads was not found”可以找到很多相關(guān)的帖子,但大多都沒(méi)有提供完整解決方案。
下面來(lái)分析一下上面的出錯(cuò)情況,并就此提供一個(gè)解決方案。從上面的出錯(cuò)可以很明顯的看出是說(shuō)系統(tǒng)缺少線程庫(kù)。沒(méi)有線程,Linux可以運(yùn)行嗎?呵呵,那當(dāng)然不行。既然沒(méi)有l(wèi)inuxthread那現(xiàn)在用的是什么呢?
答案是NPTL。
作為去除過(guò)時(shí)的LinuxThreads 庫(kù)的一個(gè)步驟,在 Fedora Core 5 test1 中編譯和連接的代碼現(xiàn)在自動(dòng)使用NPTL頭文件和庫(kù)。在過(guò)去的版本中,從 Red Hat Linux 9 開(kāi)始,默認(rèn)的線程模型是LnuxThreads,因?yàn)榻涌谑亲钔ㄓ玫摹PTL 接口的優(yōu)點(diǎn)在于,線程取消的處理更快 (使用 -fexception 參數(shù)時(shí),即使在 C 代碼中)。現(xiàn)在附加的接口也已可用,不需要特殊的編譯器和連接器參數(shù)。
下面言歸正轉(zhuǎn),怎樣解決?
可以修改程序去支持NPTL,也可以在編譯時(shí)加上對(duì)原有thread庫(kù)的支持。我選擇了后者,這樣可以不動(dòng)MySql的源代碼。在mysql手冊(cè)中搜關(guān)鍵字thread,可以查到在Chapter 2. Installing and Upgrading MySQL。
2.8.5. MIT-pthreads Notes
- If your system does not provide native thread support, you should build MySQL using the MIT-pthreads package.
- This includes older FreeBSD systems, SunOS 4.x, Solaris 2.4 and earlier, and some others. See Section 2.1.1, “Operating Systems Supported by MySQL”.
- Beginning with MySQL 4.0.2, MIT-pthreads is no longer part of the source distribution.
- If you require this package, you need to download it separately from http://www.mysql.com/Downloads/Contrib/pthreads-1_60_beta6-mysql.tar.gz
- After downloading, extract this source archive into the top level of the MySQL source directory.
- It creates a new subdirectory named mit-pthreads.
從上可以看出:只要下到mit-thread源碼就可以了。但不知道為什么官方網(wǎng)站上已經(jīng)沒(méi)有下了的了(我又找了一個(gè)官網(wǎng)的鏡像還是沒(méi)有,郁悶ing)。再仔細(xì)看一下上面,只是將線程源碼放到MySql源碼目錄的根目錄下以mit-pthreads命名的目錄。官方?jīng)]有自己去下一個(gè)也是一樣的,只要解壓后放到上述位置就可了。
于是去下了一個(gè)pthread源碼包,解壓放到相應(yīng)位置。
再執(zhí)行:
- #./configure --prefix=/usr/local/mysql --with-mit-threads
就順利通過(guò)了。
附:NPTL與 LinuxThreads 相比的優(yōu)點(diǎn)
NPTL 沒(méi)有使用管理線程。管理線程的一些需求,例如向作為進(jìn)程一部分的所有線程發(fā)送終止信號(hào),是并不需要的;因?yàn)閮?nèi)核本身就可以實(shí)現(xiàn)這些功能。內(nèi)核還會(huì)處理每個(gè)線程堆棧所使用的內(nèi)存的回收工作。它甚至還通過(guò)在清除父線程之前進(jìn)行等待,從而實(shí)現(xiàn)對(duì)所有線程結(jié)束的管理,這樣可以避免僵尸進(jìn)程的問(wèn)題。由于 NPTL 沒(méi)有使用管理線程,因此其線程模型在 NUMA 和 SMP 系統(tǒng)上具有更好的可伸縮性和同步機(jī)制。
使用 NPTL 線程庫(kù)與新內(nèi)核實(shí)現(xiàn),就可以避免使用信號(hào)來(lái)對(duì)線程進(jìn)行同步了。為了這個(gè)目的,NPTL 引入了一種名為 futex 的新機(jī)制。futex 在共享內(nèi)存區(qū)域上進(jìn)行工作,因此可以在進(jìn)程之間進(jìn)行共享,這樣就可以提供進(jìn)程間 POSIX 同步機(jī)制。我們也可以在進(jìn)程之間共享一個(gè) futex。這種行為使得進(jìn)程間同步成為可能。實(shí)際上,NPTL 包含了一個(gè) PTHREAD_PROCESS_SHARED 宏,使得開(kāi)發(fā)人員可以讓用戶級(jí)進(jìn)程在不同進(jìn)程的線程之間共享互斥鎖。
由于 NPTL 是 POSIX 兼容的,因此它對(duì)信號(hào)的處理是按照每進(jìn)程的原則進(jìn)行的;getpid() 會(huì)為所有的線程返回相同的進(jìn)程 ID。例如,如果發(fā)送了 SIGSTOP 信號(hào),那么整個(gè)進(jìn)程都會(huì)停止;使用 LinuxThreads,只有接收到這個(gè)信號(hào)的線程才會(huì)停止。這樣可以在基于 NPTL 的應(yīng)用程序上更好地利用調(diào)試器,例如 GDB。
由于在 NPTL 中所有線程都具有一個(gè)父進(jìn)程,因此對(duì)父進(jìn)程匯報(bào)的資源使用情況(例如 CPU 和內(nèi)存百分比)都是對(duì)整個(gè)進(jìn)程進(jìn)行統(tǒng)計(jì)的,而不是對(duì)一個(gè)線程進(jìn)行統(tǒng)計(jì)的。
NPTL 線程庫(kù)所引入的一個(gè)實(shí)現(xiàn)特性是對(duì) ABI(應(yīng)用程序二進(jìn)制接口)的支持。這幫助實(shí)現(xiàn)了與 LinuxThreads 的向后兼容性。
【編輯推薦】