Сигнализировать барьер, не дожидаясь его - PullRequest
0 голосов
/ 30 мая 2019

При использовании барьера потоки выстраиваются в линию и выполняются одновременно с рандеву. Например, есть 4 потока, и барьер инициализируется как 4 единицы. Темы запускаются в основном потоке.

t1.start() -> return true, thread1 is waiting on barrier.

t2.start() -> return false, thread2 starts failed!

Здесь я хочу сигнализировать о барьере без блокировки основного потока. Является ли это возможным?

t3.start() -> return false, thread3 starts failed!

Такая же ситуация происходит в потоке3. И наконец,

t4.start() -> return true, thread4 is waiting on barrier.

Как показано выше, запуск двух потоков завершился неудачно. Следовательно, как сигнализировать об успешном запуске потоков без них? Подождать дважды на основной ветке невозможно. Q1: Как сигнализировать о барьере, не дожидаясь его.

Мой барьер построен семафором, как описано в Маленькой книге семафоров. wait функция:

mutex.wait()
count = count + 1
mutex.signal()

if count == n: barrier.signal()

barrier.wait()
barrier.signal()

Текущее решение - удаление двух последних строк. wait_nolock функция:

mutex.wait()
count = count + 1
mutex.signal()

if count == n: barrier.signal()

Q2: Я не знаю, является ли это правильным решением. Очевидно, что барьер является барьером, который нельзя использовать повторно.

...