Всякий раз, когда переменная заблокирована, я хочу, чтобы какое-то сообщение выводилось наподобие «поток x пытается заблокировать, но не может», чтобы я ЗНАЛ, что он работает правильно.Почему ты этого хочешь?Вы только узнаете о темах.Изучите основы в первую очередь.Не углубляйтесь в глубокий конец в pthread_mutex_trylock
или мьютексы, настроенные для проверки ошибок.Вам нужно научиться ходить, прежде чем вы научитесь бегать.
Основы включают инициализацию мьютекса с настройками по умолчанию и использование pthread_mutex_lock
для захвата блокировки.При настройках по умолчанию pthread_mutex_lock
вернет ненулевое значение только в случае больших и больших проблем.Здесь могут возникнуть только две проблемы: тупик и неверный указатель мьютекса.Там нет восстановления ни от одного;единственное реальное решение - это исправить код.Единственное, что вы можете здесь сделать, это создать исключение, которое вы не перехватываете, вызвать exit () или abort () и т. Д.
То, что какой-то другой поток заблокировал мьютекс, не является большой проблемой.,Это не проблема вообще.pthread_mutex_lock
будет блокироваться (например, идти спать), пока блокировка не станет доступной.Нулевой возврат от pthread_mutex_lock
означает, что вызывающий поток теперь имеет блокировку.Просто убедитесь, что вы сняли блокировку, когда закончили работать с защищенной памятью.
Редактировать
Вот предложение, которое позволит вам увидеть, что механизм потоков работает так, как объявлено.
- При вводе в
increaseByHundred
распечатать сообщение с отметкой времени, указывающее на вход в функцию.Вы, вероятно, хотите использовать C printf
здесь, а не C ++ I / O.printf()
и связанные функции являются поточно-ориентированными.C ++ 2003 В / В нет. - После успешного возврата из
pthread_mutex_lock
напечатайте еще одно сообщение с меткой времени, указывающее на успешную блокировку. sleep()
на несколько секунд, а затем напечатайтееще одно сообщение с отметкой времени до вызова pthread_mutex_unlock()
. - Сделайте то же самое перед вызовом
pthread_exit()
.
Последний комментарий: вы проверяете ошибку, возвращаемую из pthread_mutex_lock
.Для полноты и потому, что каждый хороший программист параноик, когда все выходят, вы должны также проверить статус возврата с pthread_mutex_unlock
.
Как насчет pthread_exit
?У него нет статуса возврата.Вы могли бы напечатать некоторое сообщение после вызова pthread_exit
, но вы достигнете этого утверждения только в том случае, если вы используете несовместимую версию библиотеки потоков.Функция pthread_exit()
не может вернуться к вызывающей функции.Период.Беспокойство по поводу того, что произойдет, когда pthreads_exit()
вернется, - упражнение в шляпе из фольгиВ то время как хорошие программисты должны быть параноиками, они не должны быть параноиками-шизофрениками.