Я знаю, что это было задано раньше (и я буду продолжать изучать), но мне нужно знать, как сделать определенную связанную функцию списка безопасным потоком. Моя текущая проблема заключается в том, что у меня есть один поток, который перебирает все элементы в связанном списке, а другой может добавить еще несколько элементов в конец этого списка. Иногда бывает, что один поток пытается добавить еще один элемент в список, в то время как первый занят итерацией через него (что вызывает исключение).Сделать связанный список потоком безопасным
Я думал просто добавить переменную (логический флаг), чтобы сказать, что список в настоящее время занят, итерации, но как я могу проверить его и ждать со вторым потоком (это нормально, если он ждет, как первый поток работает довольно быстро). Единственный способ, которым я могу это сделать, - использовать цикл while, постоянно проверяющий этот флаг занятости. Я понял, что это была очень глупая идея, так как это заставило бы CPU усердно работать, не делая ничего полезного. И теперь я здесь, чтобы попросить лучшего понимания. Я читал о замках и т. Д., Но в моем случае это не кажется актуальным, но, возможно, я ошибаюсь?
В то же время я продолжу поиск в Интернете и отправлю обратно, если найду решение.
EDIT: Сообщите мне, если я должен опубликовать некоторый код, чтобы прояснить ситуацию, но я попытаюсь объяснить его более четко.
Итак, у меня есть класс со связанным списком в нем, который содержит элементы, требующие обработки. У меня есть один поток, который выполняет итерацию через этот список через вызов функции (назовем его «processElements»). У меня есть второй поток, который добавляет элементы для обработки недетерминированным способом. Однако иногда бывает так, что он пытается вызвать эту функцию addElement во время работы processElements. Это означает, что элемент добавляется в связанный список, когда он проходит через первый поток. Это невозможно и вызывает исключение. Надеюсь, это очистит его.
Мне нужна нить, которая добавляет новые элементы для вывода, пока процесс processElements не будет выполнен.
- Кому-то, кто наткнулся на эту проблему. Принятый ответ даст вам быстрое, простое решение, но посмотрите ответ Брайана Гидеона ниже для более полного ответа, который определенно даст вам больше понимания!
Вы ошибаетесь. Замки - это именно то, что вам нужно. –
Это прекрасно (отсюда «возможно, я ошибаюсь»). Спасибо, хотя, я буду держать на нем, пока не выясню, как его применять. +1 к вам за предоставление решения – Denzil
Вам нужно создать поточный, не «а» метод. И это было задано и ответило много раз. –