关于OpenBSD和Linux上pthread_cond_wait的不同行为

时间:2018-09-27 02:12:44

标签: c linux unix pthreads

我正在OpenBSD-currentArch 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之后,我唯一能得出的解释是发生了“虚假唤醒”。我有时会运行程序,每次都会立即退出。如何理解这种行为?每次都会发生“虚假唤醒”吗?还是其他?

1 个答案:

答案 0 :(得分:3)

在Linux(可能还有其他一些OS)上编译多线程程序时,gcc需要传递-pthread,这使其自动与线程库链接,并执行在该特定系统上使用线程所需的任何其他重要事项

我不确定,但是我认为 glibc具有虚拟线程函数,该虚拟线程函数不执行任何操作(它肯定具有诸如pthread_cond_wait()之类的函数的定义),这是为什么没有-pthread的代码在编译时没有链接器错误。

当将代码与配置/构建系统一起使用而不是手工编译时,cmake具有FindThreads来以操作系统和编译器无关的方式设置所需的编译器标志和库。如果使用autoconf,则autoconf macro archive包含一个执行相同操作的ax_pthread宏。其他系统可能有自己的方式。这些只是我所熟悉的两个。