Parece estar relacionado con la plataforma (funciona con Ubuntu 12.04 en mi computadora portátil, no funciona con otro Ubuntu 12.04 en mi estación de trabajo).C++ 11 <thread> representación multithreads con OpenGL evita el hilo principal lee stdin
Este es un código de muestra sobre lo que estoy haciendo con dos hilos.
#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();
}
Aquí está mi parámetros de compilación:
g++ -std=c++0x -o main main.cc -lpthread -lglfw
Mi portátil de ejecución de este programa, así:
init
inited
render
render
q
user input: q
user interrupt
quit
y estaciones de trabajo acaba de salidas:
init
inited
render
render
q
render
q
render
q
render
^C
Simplemente simplemente ignoró mis entradas (otro programa En el mismo procedimiento con glew y glfw, simplemente salte del ciclo while en el hilo principal, sin leer mis entradas.) PERO ¡Esto funciona normalmente con gdb!
¿alguna idea de lo que está pasando?
actualización
Después de más pruebas en otras máquinas, controlador de NVIDIA causado esto. Lo mismo ocurre en otras máquinas con tarjeta de gráficos NVIDIA.
Intenta hacer 'g_run' a' std :: atomic 'en lugar de un simple' bool'. –
ildjarn
intentado y no funciona. no hay condiciones de carrera en este caso, ya que solo un hilo está escribiendo en él. – xiaoyi
Un hilo está escribiendo mientras otro está leyendo. Usted ** necesita ** una barrera de memoria. – ildjarn