#c #multithreading #unix #pthreads #semaphore
#c #многопоточность #unix #pthreads #семафор
Вопрос:
В настоящее время я работаю над программой, в которой я использую потоки для просмотра каталогов, чтобы найти общее использование диска. У меня проблема, на которую я, похоже, не могу найти ответ.
У меня есть функция, позволяющая увидеть, содержит ли текущий каталог другой каталог, и если это так, я хочу добавить путь к новому каталогу в стек. Эта работа выполняется потоком, если поток продвигает путь к новому каталогу, другой поток будет искать в этом каталоге.
Проблема, с которой я сталкиваюсь, заключается в том, чтобы найти правильное условие для работы потоков, я хочу, чтобы потоки выполняли поиск работы (если есть какие-либо пути для поиска, например, если в стеке есть какое-либо значение) до тех пор, пока какой-либо поток выполняет работу.
Я думаю что-то вроде этого:
While(any thread is working){
while(stack != empty){
do work
}
sleep()
}
Я не знаю, как я могу узнать, работает ли какой-либо из моих потоков в настоящее время «выполняет работу», это самый простой способ отправить флаг work_complete или я могу использовать для этого семафоры. Я не могу найти какой-либо аналогичной проблемы, просто «более простые» примеры, когда они используют потоки для печати / подсчета чего-либо.
Редактировать:
Более простой версией моего вопроса было бы: как я узнаю, находится ли какой-либо из моих потоков внутри функции «do work»?
Комментарии:
1. Вы можете использовать все, что отслеживает количество работающих потоков.
2. @g_bor Не могли бы вы углубиться в то, что вы имеете в виду. Чтобы прояснить мой вопрос, я хочу знать, находится ли какой-либо поток внутри «do work»
3. Мой pthreading устарел, но я считаю, что что-то вроде
pthread_tryjoin_np
того, что вы ищете. По сути, тыкаем в поток и смотрим, жив ли он, не блокируя тыкающий поток. Это расширение gcc, поэтому оно не является переносимым (np).4. Если вы хотите знать, сколько потоков находится внутри определенного раздела кода, просто увеличьте общий счетчик при его вводе и уменьшите общий счетчик при выходе. Я не уверен, что это лучший дизайн, но это не сложно. Счетчик может быть семафором или просто
_Atomic
.5. Честно говоря, это выглядит так, как будто вы забиваете гвозди отверткой. Это может «работать», но… Размещение этого
sleep
в сочетании с этими сложенными while-предикатами кричит мне, что надлежащим решением было бы правильно управляемое состояние и стек предикатов, защищенные мьютексом и сигнализируемые переменной условия при изменении состояния. Сложно сказать, но, как указано, это больше похоже на проблему XY, чем на что-либо еще.