An implementer who is sufficiently unambitious can solve the entire problem much more simply, and entirely within the ANSI-CL standard, and using nothing beyond that on the C++ side, and using only a single thread on each side.
Observe that the two programs perform a strict ping-pong exchange. A sends a communication to B, then B sends a reply to A. No variation. Since the exchange involves a human and a keyboard, neither transmission rate not latency matters.
The two programs need only agree on two writable files, .../message and .../semaphore .
A creates, writes, and closes message, then creates, writes, and closes semaphore worth the single character A. B waits in a (sleep 1) loop until the semaphore file exists with the expected content. B reads and deletes both files, then creates, writes, and closes message, then creates semaphore containing the single character B, while A waits for the semaphore to exist with the proper content. ...
All this can be accomplished with just a few lines of code on the Lisp side and a ridiculously (but only proportionally) larger number of lines on the C++ side. Some error checking might be required, for insurance if the local filesystem prevent a file from being opened for input while still open for output.
Of course, both programs must run on the same host, or at least have access to a shared file system.