Я открываю библиотеку pthread (в C) и у меня возникают проблемы с пониманием нескольких вещей.
Прежде всего, я понимаю, что такое мьютекс, я понимаю, как он работает,хорошо, я также понимаю концепцию cond, но мне не удается правильно ее использовать (я не совсем понимаю, как объединить мьютекс и cond)
Это в псевдокоде, что я хочу сделать:
thread :
loop :
// do something
end loop
end thread
Таким образом, существует n потоков, но каждый поток использует одну и ту же функцию.Я хочу, чтобы внутренняя часть цикла выполнялась параллельно всеми потоками, НО каждый поток должен находиться в одной и той же итерации цикла. Это означает, что мне все равно, в каком порядке выполняются инструкции внутри цикла между потоками, ноначать итерацию 2 потока, все другие потоки должны завершить итерацию 1 (и т. д.).Итак, мой вопрос: как ты это делаешь?Не особенно в конкретном примере, но теоретически.
РЕДАКТИРОВАТЬ
Мне удается это сделать, я не знаю, правильно ли это, но это работает:
global nbOfThreads
global nbOfIterations
thread :
lock(mutex0)
unlock(mutex0)
loop :
// Do something
lock(mutex1)
nbOfIterations++
if (nbOfIterations == nbOfThread) :
nbOfIterations = 0
broadcast(cond)
unlock(mutex1)
continue
end if
wait(cond, mutex1)
unlock(mutex1)
end loop
end thread
main (n) :
nbOfThreads = n
nbOfIterations = 0
lock(mutex0)
do nbOfThreads times : create(thread)
unlock(mutex0)
end main
Я, очевидно, пытался понять себя, но есть некоторые вещи, которые я не понимаю:
- Основная причина: ПОЧЕМУ нужно условие?пара с мьютексом
- В некоторых примерах я видел что-то вроде этого:
// thread A :
while (!condition)
wait(&cond)
// thread B :
if (condition)
signal(&cond)
ну, я действительно не понимаю смысла в этом цикле while, я думал, подожди, поставьПоток в паузе, пока условие не выполнится (пока другой поток не отправит сигнал).Я имею в виду, я бы получил это, если бы это было, а не какое-то время.
Спасибо