Today, I wrote a small pthread
program to do some testing:
#include <pthread.h>
int main(void)
{
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cv = PTHREAD_COND_INITIALIZER;
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cv, &mutex);
return 0;
}
Build and test it on OpenBSD-current
(version is 6.4
):
# cc cv_test.c -o cv_test
# ./cv_test
The program will block there and it is my expected result. Switch to Arch Linux
(kernel version is 4.18.9
):
# cc cv_test.c -o cv_test
# ./cv_test
#
The program will exit immediately. I doubt it is “spurious awake” firstly, but can’t get a convincing explanation. Using ldd
to check program. On OpenBSD
:
# ldd cv_test
cv_test:
Start End Type Open Ref GrpRef Name
000000d4c3a00000 000000d4c3c02000 exe 1 0 0 cv_test
000000d6e6007000 000000d6e62f6000 rlib 0 1 0 /usr/lib/libc.so.92.5
000000d6db100000 000000d6db100000 ld.so 0 1 0 /usr/libexec/ld.so
On Arch Linux
:
# ldd cv_test
linux-vdso.so.1 (0x00007ffde91c6000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f3e3169b000)
/lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007f3e3187a000)
Nothing special. After seeking help on stackoverflow, the answer is I need adding -pthread
option:
# cc -pthread cv_test.c -o cv_test
# ./cv_test
This time it worked perfectly. Checking linked library:
# ldd cv_test
linux-vdso.so.1 (0x00007fff48be8000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007fa46f84c000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007fa46f688000)
/lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007fa46f888000)
Why doesn’t Linux
give me a link error which prompts I need link libpthread
? It seems not make sense.