Я смотрю на меня так, будто ты пытаешься встретиться (термин от Ады).
Второй поток сидит, ожидая, когда первый поток вызовет его, затем он выполняет некоторую работу немедленно, пока ожидает первый поток, и еще некоторую работу после завершения первого потока.
Первый поток «вызывает» второй поток - с немедленным тайм-аутом, если второй поток недоступен для приема вызова.
Ада поддерживает это непосредственно на языке, но при условии, что перенос на Аду не вариант ...
Это можно реализовать с помощью трех семафоров. Семафор 1 указывает, что поток 1 готов к свиданию. Семафор 2 указывает, что поток 2 готов к рандеву. Семафор 3 указывает, что встреча завершена.
Тема 1: по умолчанию используется семафор 1.
if Semaphore 2.acquire(timeout = 0) is successful # Thread 2 is ready
Semaphore 1.release() # Indicate I am ready
Semaphore 3.acquire() # Wait until the rendevous is complete.
Semaphore 3.release()
Semaphore 1.acquire() # Indicate I am not ready
Semaphore 2.release() # I am no longer using thread 2.
Do concurrent work
Поток 2: приобретены значения по умолчанию с семафором 2.
Loop forever
Semaphore 3.acquire() # Indicate Rendevous is not complete.
Semaphore_2.release() # Indicate I am ready
Semaphore_1.acquire() # Wait for Thread 1 to be ready
Joint processing
Semaphore 1.release() # I am no longer using thread 1.
Semaphore 3.release() # Rendevous is complete.
Semaphore 2.acquire() # I am not ready
Post-processing
ПРИМЕЧАНИЕ. Написано с нуля, не проверено. Выглядит намного сложнее, чем я думал, когда я начинал; я что-то пропустил?