C ++: мьютекс и освобождение - PullRequest
0 голосов
/ 03 мая 2011

Я пишу небольшую программу в рамках университетского курса. В этой программе у меня есть глобальный Boost Mutex, который помогает мне координировать два потока.

В моей маленькой библиотеке я должен написать функцию очистки, которая при вызове буквально очищается после себя.

Теперь я спрашиваю: если я создаю мьютекс, должен ли я также освобождать его, когда он мне больше не нужен?

Код, который я использую, просто

boost::mutex mymutex;

Большое спасибо

Ответы [ 6 ]

1 голос
/ 03 мая 2011

Повышающие мьютексы, кажется, написаны для выполнения всей их очистки в своих деструкторах. Если вы хотите подготовить этот же мьютекс к повторному использованию, возможно, вы захотите вызвать .unlock() один раз.

Если вы действительно чувствуете необходимость избавиться от него вручную, я полагаю, вы могли бы сделать его указателем и создать его с new. Таким образом, вы можете вручную управлять запуском его деструктора в подпрограмме очистки, вызывая delete на указателе. Тем не менее, указатели подвержены ошибкам, поэтому использование одного из них просто позволяет показать, что он очищается вручную (вместо того, чтобы это происходило автоматически, когда объект выходит из области видимости в конце вашей программы), равно stoopid . Если вы получите пару очков за то, что не сделали этого, я бы посчитал небольшую цену, чтобы заплатить за правильное проектирование.

Если вы действительно обеспокоены потерей баллов за то, что не удалили вручную автоматически уничтоженные ресурсы, на вашем месте я был бы Я бы попросил моего инструктора, что мне нужно сделать . Школа не бесплатна (в отличие от SO), и такая консультация является частью того, за что вы платите им все эти деньги. Может также получить какое-то значение для этого.

1 голос
/ 03 мая 2011

Он будет освобожден при выходе из области видимости, определенной фигурными скобками. Вы должны быть осторожны, чтобы разблокировать мьютекс.

0 голосов
/ 03 мая 2011

Когда вы определяете объект (в отличие от указателя), например, в -

boost::mutex mymutex;

- C ++ будет вызывать деструктор объекта, когда объект выходит из области видимости.

Что вам нужно сделать сейчас - это проверить документацию boost :: mutex о том, что он будет делать, когда вызывается его d'tor.Тем не менее, вы можете быть уверены, что любой класс внутри boost очистит свои ресурсы в своем dtor (в конце концов, для этого существует dtor).Что вы не знаете, не проверив документы, так это поведение Mutex.это функция lock (), когда вызывается dtor.

Поскольку у вас есть глобальный объект, его dtor будет вызываться после возврата из main (), что должно быть хорошо, поскольку освобождение ресурса идет.

0 голосов
/ 03 мая 2011

@ Данило: Я уверен, что курс не требует, чтобы вы использовали boost, и преподаватель ожидает, что вы будете использовать API pthreads напрямую.

В этом случае вы захотите позвонить pthread_mutex_init и pthread_mutex_destroy, и это повышение автоматически сделает для вас

0 голосов
/ 03 мая 2011

В функции очистки вам может понадобиться вызвать методы освобождения / сброса объекта boost::mutex, чтобы убедиться, что вы не оставляете его в сигнальном состоянии.

0 голосов
/ 03 мая 2011

Неа. Объекты в C ++ убираются за собой. Вам нужно было бы очистить мьютекс, только если он был выделен динамически с помощью new.

...