通过google查得linuxthread是传统的线程模式,Linux 2.6内核以前所有版本的标准Linux超线程库被称为LinuxThreads。这种库可以与不低于GLIBC 2.0版本GNU C库一起工作,并且与POSIX兼容;nptl是更优的线程模式,NPTL自从出现2.5内核后便开始逐渐代替LinuxThreads和NGPT。NPTL为Linux系统提供更高性能的超线程支持,并且可提供多线程企业应用软件所需的基本功能,此外还可提供高容量、高加载量的网络和邮件服务器等。
但是它们是否会同时共存呢?参考redhat与archlinux的glibc编译指引,好像都有两种线程的编译选项,就是看不明白是否同时编译两种线程模式。
这是archlinux的glibc编译指引: mkdir build-linuxthreads
cd build-linuxthreads
if echo '__thread int a;' | gcc -xc - -S -o /dev/null 2>/dev/null; then
sed -i -e 's/0 [|][|]/1 ||/' ../elf/tst-tls10.h ../linuxthreads/tst-tls1.h
fi
AddOns=`cd .. && echo */configure | sed -e 's!/configure!!g;s!\(linuxthreads\|nptl\|rtkaio\)\( \|$\)!!g;s! \+$!!;s! !,!g;s!^!,!;/^,\*$/d'`
CFLAGS="${CFLAGS} -DNDEBUG=1" ../configure --prefix=/usr \
--enable-add-ons=linuxthreads${AddOns} --without-cvs \
--enable-kernel=2.4.1 --disable-profile \
--with-headers=$startdir/pkg/usr/include \
--enable-bind-now --with-tls --without-__thread \
--build ${CHOST} --host ${CHOST}
make -r CFLAGS="${CFLAGS}" || return 1
make install_root=${startdir}/pkg install || return 1
make install_root=${startdir}/pkg localedata/install-locales || return 1
cd ..
mkdir build-nptl
cd build-nptl
CFLAGS="${CFLAGS} -DNDEBUG=1" ../configure --prefix=/usr \
--enable-add-ons=nptl${AddOns} --without-cvs \
--enable-kernel=2.6.6 --disable-profile \
--with-headers=$startdir/pkg/usr/include \
--enable-bind-now --with-tls --with-__thread \
--build ${CHOST} --host ${CHOST}
make -r CFLAGS="${CFLAGS}" || return 1
cd build-nptl
mkdir -p ${startdir}/pkg/lib/tls/
libcsofile=`basename ${startdir}/pkg/lib/libc-*.so`
cp -a libc.so ${startdir}/pkg/lib/tls/${libcsofile}
ln -sf ${libcsofile} ${startdir}/pkg/lib/tls/`ls libc.so.*`
libmsofile=`basename ${startdir}/pkg/lib/libm-*.so`
pushd math > /dev/null
cp -a libm.so ${startdir}/pkg/lib/tls/${libmsofile}
ln -sf ${libmsofile} ${startdir}/pkg/lib/tls/`ls libm.so.*`
popd > /dev/null
librtsofile=`basename ${startdir}/pkg/lib/librt-*.so`
pushd rt > /dev/null
cp -a librt.so ${startdir}/pkg/lib/tls/${librtsofile}
ln -sf ${librtsofile} ${startdir}/pkg/lib/tls/`ls librt.so.*`
popd > /dev/null
libthreaddbsofile=`basename ${startdir}/pkg/lib/libthread_db-*.so`
pushd nptl_db > /dev/null
cp -a libthread_db.so ${startdir}/pkg/lib/tls/${libthreaddbsofile}
ln -sf ${libthreaddbsofile} ${startdir}/pkg/lib/tls/`ls libthread_db.so.*`
popd > /dev/null
libpthreadsofile=libpthread-${pkgver}.so
pushd nptl > /dev/null
cp -a libpthread.so ${startdir}/pkg/lib/tls/${libpthreadsofile}
ln -sf ${libpthreadsofile} ${startdir}/lib/tls/`ls libpthread.so.*`
popd > /dev/null
mkdir -p ${startdir}/pkg/usr/lib/nptl
cp -a libc.a nptl/libpthread.a nptl/libpthread_nonshared.a rt/librt.a \
${startdir}/pkg/usr/lib/nptl
for lib in libc libpthread; do
sed -e "s:/lib/${lib}.so:/lib/tls/${lib}.so:g" \
-e "s:/usr/lib/${lib}_nonshared.a:/usr/lib/nptl/${lib}_nonshared.a:g" \
${startdir}/pkg/usr/lib/${lib}.so \
> ${startdir}/pkg/usr/lib/nptl/${lib}.so
chmod 755 ${startdir}/pkg/usr/lib/nptl/${lib}.so
done
ln -sf ../librt.so ${startdir}/pkg/usr/lib/nptl/librt.so
mkdir -p ${startdir}/pkg/nptl ${startdir}/pkg/usr/include/nptl
make install_root=${startdir}/pkg/nptl install-headers || return 1
pushd ${startdir}/pkg/nptl/usr/include > /dev/null
for i in `find . -type f`; do
if ! [[ -f ${startdir}/pkg/usr/include/${i} ]] \
|| ! cmp -s ${i} ${startdir}/pkg/usr/include/${i}; then
mkdir -p ${startdir}/pkg/usr/include/nptl/`dirname ${i}`
cp -a ${i} ${startdir}/pkg/usr/include/nptl/${i}
fi
done
popd > /dev/null
rm -rf ${startdir}/pkg/nptl
rm -rf ${startdir}/pkg/etc/ld.so.cache ${startdir}/pkg/etc/localtime
install -D -m644 ${startdir}/src/glibc-${_snap}/nscd/nscd.conf ${startdir}/pkg/etc/nscd.conf
install -D -m755 ${startdir}/src/nscd ${startdir}/pkg/etc/rc.d/nscd
sed -i -e 's/^\tserver-user/#\tserver-user/' ${startdir}/pkg/etc/nscd.conf || return 1
} |