2016-06-17 4 views
1

У меня есть вопрос.Синхронизация параллельных потоков

Я пытаюсь создать некоторую поточную синхронизацию с основным потоком, используя C++, но лучше, если вы ответите через псевдокод. Я не использую никаких фреймворков для C++ и не хочу их использовать!

Вот моя проблема:

У меня есть основной поток, запустить код в цикле, и потоки (не знаю, сколько и раньше, но я могу сохранить их в какой-то список, когда это необходимо), которые работают другие код в циклах. Код потоков (друг друга) может быть одинаковым или другим, не имеет значения. Вот некоторая базовая схема scheme

Все потоки, которые должны быть выполнены, должны встречаться на 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(); 
    } 
} 

Я думаю об использовании асинхронном, но лучше, чем переписывания кода (не зная результата), я хотел бы иметь дело с этой проблемой, таким образом.

+0

Попытайтесь выполнить поиск в поисковых системах для блокировки данных и алгоритмов – mvidelgauz

ответ

1

Я хотел бы использовать что-то вроде WaitForMultipleObjects (...) ->https://msdn.microsoft.com/en-us/library/windows/desktop/ms687025(v=vs.85).aspx

Основная идея заключается в следующем:

-У ваш главный ход резьбы, пока он не достигнет S1. Затем сон с WaitForMultipleObjects (...).

-Нажмите остальные потоки, пока они не нанесут удар S1, и поднимите событие с помощью SetEvent (..). Затем каждый сон использует WaitForSingleObject (..).

-Поскольку друг другу поток вызвал SetEvent (..), ваш основной поток проснется. Как только он просыпается, он вызовет SetEvent (..), чтобы разбудить друг друга, который ждет, используя WaitForSingleObject (..).Теперь все они будут выполняться между S1 и S2 синхронно.

-Тогда выполните то же самое, чтобы синхронизировать, когда вы достигнете S2.

Вам не обязательно использовать этот фреймворк, но это общий дизайн для синхронизации потоков.

+0

Это похоже на то, что я искал .. Просто для Linux ... Но я, возможно, справимся с этим, спасибо .. – Payne

-1

Если у вас есть последний компилятор, который поддерживает exprerimental функции, barrier может быть хорошим выбором.

+0

Я сделал свой собственный барьер, используя монитор (мьютекс + cv). В S2 у меня был метод Wait Barrier, на S1 я сбросил барьер. Он зашел в тупик после некоторого большого количества итераций. Но было .. Может мне понадобится еще несколько замков, но не знаю, как .. Может, я сделал что-то не так. – Payne