Я думаю, что вместо того, чтобы пытаться создать два потока для рисования на экране, вам нужно использовать шаблон MVC и сделать вашу модель поточно-ориентированной. Затем у вас может быть один поток, который получает необходимую информацию из модели каждого кадра и выводит ее на экран, а затем два других потока, один для графики и один для командной строки, которые управляют только моделью.
Так, например, у вас есть класс Simulation, в котором есть 3D-графика, а затем класс CommandLine с вашей командной строкой. Каждый из этих классов вообще не использует OpenGL; только управляет данными, например, где вещи находятся в трехмерном пространстве, а в случае командной строки - очередь строк на экране. Затем поток opengl может запрашивать потокобезопасные функции этих классов в каждом кадре, чтобы получить необходимую информацию. Так, например, он захватывает позиции трехмерных объектов, рисует их на экране, затем захватывает линии, отображаемые в командной строке, и рисует их.