我正在OpenBSD-current
和Arch Linux
(内核版本为4.18.9
)上测试以下代码:
#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;
}
在OpenBSD-current
上:程序不会永远退出并阻塞,并且符合我的期望,因为没有线程向主线程发出信号:
# cc cv_test.c -o cv_test
# ./cv_test
但是在Arch Linux
上,程序将立即退出:
# cc cv_test.c -o cv_test
# ./cv_test
#
参考linux
manual之后,我唯一能得出的解释是发生了“虚假唤醒”。我有时会运行程序,每次都会立即退出。如何理解这种行为?每次都会发生“虚假唤醒”吗?还是其他?
答案 0 :(得分:3)
在Linux(可能还有其他一些OS)上编译多线程程序时,gcc需要传递-pthread
,这使其自动与线程库链接,并执行在该特定系统上使用线程所需的任何其他重要事项
我不确定,但是我认为 glibc具有虚拟线程函数,该虚拟线程函数不执行任何操作(它肯定具有诸如pthread_cond_wait()
之类的函数的定义),这是为什么没有-pthread
的代码在编译时没有链接器错误。
当将代码与配置/构建系统一起使用而不是手工编译时,cmake具有FindThreads来以操作系统和编译器无关的方式设置所需的编译器标志和库。如果使用autoconf,则autoconf macro archive包含一个执行相同操作的ax_pthread宏。其他系统可能有自己的方式。这些只是我所熟悉的两个。