Разное поведение pthread_cond_wait в OpenBSD и Linux - PullRequest
0 голосов
/ 27 сентября 2018

Я тестирую следующий код на 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 руководство , единственное объяснение, которое я могу найти, - это "ложное пробуждение".Я запускаю программу несколько раз, она будет выходить сразу каждый раз.Как понять это поведение?происходит "ложное пробуждение" каждый раз?Или что-то еще?

1 Ответ

0 голосов
/ 27 сентября 2018

При компиляции многопоточных программ в Linux (и, возможно, в некоторых других ОС) gcc должен быть передан -pthread, что позволяет ему автоматически связываться с библиотекой потоков и выполнять любые другие важные действия, необходимые для использования потоков в этой конкретной системе.

Я не уверен, но я думаю, glibc имеет фиктивные функции потоков, которые ничего не делают (у него, безусловно, есть определения для функций, таких как pthread_cond_wait(), по крайней мере), поэтомукод без -pthread компилируется без ошибки компоновщика.

При использовании вашего кода с системой конфигурации / сборки вместо компиляции вручную, cmake имеет FindThreads для установки необходимых флагов компилятора ибиблиотеки в зависимости от ОС и компилятора.При использовании autoconf макроархив autoconf включает макрос ax_pthread , который делает то же самое.Другие системы, вероятно, имеют свои собственные пути;это только те, с кем я знаком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...