Pthreads умирает в середине блокировки мьютекса - PullRequest
4 голосов
/ 03 июня 2011

Я думал о следующем сценарии, происходящем во время работы pthread:

pthread_mutex_lock(...);
... // <- Thread dies here
pthread_mutex_unlock(...);

другими словами, pthread запускается, в какой-то момент он блокирует мьютекс, и по какой-то причине он умирает до того, как сможет вызвать соответствующую функцию разблокировки, либо потому, что его убил другой поток, либо самой ОС (android в данном случае), решил, что по той или иной причине его нужно убить (нужно было заняться другими делами и т. д.)

Произойдет ли это когда-нибудь на андроиде (или на любой другой ОС), если вы не вызовете pthread_kill () или что-то в этом роде, и даже если вы это сделаете, как правильно избежать такой вещи? Спасибо.

Ответы [ 2 ]

5 голосов
/ 03 июня 2011

Убийство тем никогда не бывает очень полезным. (если вы не можете позволить себе SIGKILL / отменить весь процесс в любом случае).

Вместо этого раскрутите стек за исключением и используйте RAII. Если ваш процесс / ОС стал настолько нестабильным, что происходят случайные прерывания потока, я думаю, у вас будут другие заботы, и возникший беспорядок не является обязанностью процесса.

Только не pthread_kill

Кроме того, все это может стать немного более интересным при использовании примитивов межпроцессной синхронизации. В этом случае, однако, я думаю, что ядра Linux гарантируют, что любые блокировки, удерживаемые процессом, будут сняты после завершения этого процесса, независимо от причины

1 голос
/ 03 июня 2011

Если нить действительно убита, то я не думаю, что что-то может помочь.(Не убивайте свои потоки. Когда-либо.)

Но есть и другая возможность: возможно, ваш код сгенерировал исключение, которое вы не перехватили.Если это так, то вы должны: (1) перехватить все исключения перед разблокировкой или намного лучше (2) создать класс защиты блокировки мьютекса (поскольку вы пометили как C ++), который блокирует мьютекс в его конструкторе и разблокирует в деструкторе, иОпределите объекты этого класса в любой области видимости, которую вы хотите заблокировать мьютексом (это безопасный для исключения подход), но это не поможет, если что-то убьет поток.

...