У меня есть вопрос.Синхронизация параллельных потоков
Я пытаюсь создать некоторую поточную синхронизацию с основным потоком, используя C++, но лучше, если вы ответите через псевдокод. Я не использую никаких фреймворков для C++ и не хочу их использовать!
Вот моя проблема:
У меня есть основной поток, запустить код в цикле, и потоки (не знаю, сколько и раньше, но я могу сохранить их в какой-то список, когда это необходимо), которые работают другие код в циклах. Код потоков (друг друга) может быть одинаковым или другим, не имеет значения. Вот некоторая базовая схема
Все потоки, которые должны быть выполнены, должны встречаться на S1. Затем должны выполнять свою работу (запустите что-то) и ждать друг друга в точке S2. Мне нужна помощь с структурами синхронизации, которые я должен использовать для потоков синхронизации.
В моем плане было 2 FIFO - новые и запущенные потоки .. Когда я создаю поток, он добавляется в новые потоки FIFO .. Где-то перед S1 точкой Основной поток Скопируйте все потоки из новых в исполняемые потоки, затем установите Barriere на номер потоков в runnable, запускать все запущенные потоки, а на S2 следует ждать Barriere. Затем запустите очередь очереди и подождите в точке S1. Но у меня были проблемы с реализацией точки синхронизации S1. Мои аттракционы заканчивались мертвыми замками.
Можете ли вы помочь мне с некоторым псевдокодом для главной темы и других тем? Как их правильно синхронизировать?
EDIT:
псевдокод:
Main T1 T2
While 1 While 1 While 1
-- S1 -- -- S1 -- -- S1 --
print a print b print c
print d - blocked - print e
- blocked - - blocked - print f
-- S2 -- -- S2 -- -- S2 --
print --- - blocked - - blocked -
End-While End-While End-While
Выход должен быть что-то вроде:
a
d
b
c
e
f
---
b
a
d
c
e
f
---
Всегда блок аф букв ..
Нужно что-то делать блокировки, как в pseudocode .. Не может быть более конкретным, не знаю, что именно я ищу ..
EDIT 2: Мне кажется, что у меня нет ответа, который я искал, я размещаю отредактированный код в C++, как синтаксис, который я использую, но не работает, может быть, кто-то помогает.
main() {
Barrier s1;
Barrier s2;
s1.reset(2);
initThread();
while(1) {
s2.reset(2);
s1.wait();
s1.reset(2);
runSomething();
s2.wait();
runQueue();
}
}
thread() {
while(1) {
s1.wait();
run();
s2.wait();
}
}
Я думаю об использовании асинхронном, но лучше, чем переписывания кода (не зная результата), я хотел бы иметь дело с этой проблемой, таким образом.
Попытайтесь выполнить поиск в поисковых системах для блокировки данных и алгоритмов – mvidelgauz