Почему pthread_mutex_lock не помечен как asyn c -signal safe? - PullRequest
0 голосов
/ 19 марта 2020

Видите ли, sem_post помечен как asyn c -сигнал безопасен. Но почему pthread_mutex_lock не помечен как asyn c -сигнал безопасен, а следующая программа создает иллюзию того, что он действительно asyn c -сигнал безопасен?

void handle(int arg){
    printf("I wake up!\n");
}
int main()
{
    signal(SIGHUP, handle);
    pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
    pthread_mutex_lock(&lock);
    printf("gonna be blocked\n");

    pthread_mutex_lock(&lock);
    pthread_mutex_unlock(&lock);
    return 0;
}

kill -hup $pid будет пусть это что-нибудь распечатает. Но блокировка все еще не получена, и программа заблокирована (я имею в виду, она не завершена sh), что создает у меня впечатление, что она безопасна для асинхронного сигнала.

Вы можете обратиться к Расширенному программированию unix Окружающая книга или man sigaction, чтобы получить список безопасных функций asyn c -signal.

1 Ответ

2 голосов
/ 19 марта 2020

Но почему pthread_mutex_lock не помечен как asyn c -Signal Safe

Потому что это не так.

в то время как следующая программа дает вам иллюзия, что это на самом деле asyn c -сигнал безопасен?

Ваша программа не имеет ничего общего с асинхронной c безопасностью сигнала. Любые выводы об асинхронности c безопасности сигнала, полученные из этой тестовой программы, совершенно неверны.

Asyn c Безопасность сигнала означает возможность вызова функции из asyn c обработчик сигнала.

Чтобы увидеть, что pthread_mutex_lock не является асинхронным c сигнал безопасен, напишите программу с 3 потоками: один выполняет pthread_mutex_lock и pthread_mutex_unlock в жестком l oop, один делает то же самое на том же мьютексе из обработчика сигнала , а третий - отправляет в процесс бесконечный поток SIGHUP s.

Если pthread_mutex_lock были асинхронными c Сигнал безопасен, эта программа будет работать вечно.

Но я ожидаю, что вы заметите, что эта программа через некоторое время либо заблокирует sh, либо заблокирует ее.

Даже если она не означает, что все же не будет означать, что pthread_mutex_lock безопасно, только то, что вы еще не доказали, что оно небезопасно .

...