C++11 многопоточный рендеринг с OpenGL предотвращает чтение основного потока из стандартного ввода

Похоже, это связано с платформой (работает с Ubuntu 12.04 на моем ноутбуке, не работает с другой Ubuntu 12.04 на моей рабочей станции).

Это пример кода того, что я делаю с двумя потоками.

#include <iostream>
#include <thread>
#include <chrono>
#include <atomic>
#include <GL/glfw.h>

using namespace std;

int main() {
  atomic_bool g_run(true);
  string s;
  thread t([&]() {
    cout << "init" << endl;

    if (!glfwInit()) {
      cerr << "Failed to initialize GLFW." << endl;
      abort();
    }

    glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 2);
    glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 1);

    if(!glfwOpenWindow(640, 480, 8, 8, 8, 0, 24, 0, GLFW_WINDOW)) {
      glfwTerminate();
      cerr << "Cannot open OpenGL 2.1 render context." << endl;
      abort();
    }

    cout << "inited" << endl;

    while (g_run) {
      // rendering something
      cout << "render" << endl;
      this_thread::sleep_for(chrono::seconds(1));
    }
    // unload glfw
    glfwTerminate();
    cout << "quit" << endl;
  });
  __sync_synchronize(); // a barrier added as ildjarn suggested.
  while (g_run) {
    cin >> s;
    cout << "user input: " << s << endl;
    if (s == "q") {
      g_run = false;
      cout << "user interrupt" << endl;
      cout.flush();
    }
  }
  __sync_synchronize(); // another barrier
  t.join();
}

Вот мои параметры компиляции:

g++ -std=c++0x -o main main.cc -lpthread -lglfw

Мой ноутбук запускает эту программу, например:

init
inited
render
render
q
user input: q
user interrupt
quit

А рабочая станция просто выводит:

init
inited
render
render
q
render
q
render
q
render
^C

Она просто игнорировала мои входные данные (другая программа, аналогичная процедура с glew и glfw, просто прыгайте из цикла while в основном потоке, без чтения моих входных данных.) НОэта штука нормально работает с gdb!

Есть идеи, что происходит?

Обновление

После дополнительных тестов на других машинах причиной стал драйвер NVIDIA. То же самое происходит и на других машинах с видеокартой NVIDIA.

7
задан genpfault 28 June 2012 в 15:48
поделиться