【发布时间】:2019-03-02 20:43:57
【问题描述】:
我正在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
#
在提到linuxmanual之后,我能出来的唯一解释是“假清醒”发生了。我运行程序几次,每次它都会立即退出。如何理解这种行为?每次都会发生“虚假清醒”吗?还是别的什么?
【问题讨论】:
-
你检查函数返回值是否有错误?
-
另外,当使用 pthreads 时,您需要使用 gcc 的
-pthread选项进行编译。这解决了 linux 上的问题。 -
@Shawn 你是对的!我试过
gcc和clang,他们都需要-pthread来解决这个问题。这似乎有点奇怪。您能否提供您的评论作为答案?如果您能详细说明为什么-pthread在Linux上如此重要,那就更好了。