Sembra essere correlato alla piattaforma (funziona con Ubuntu 12.04 sul mio portatile, non funziona con un'altra Ubuntu 12.04 sulla mia workstation).C++ 11 <thread> rendering multithreads con OpenGL impedisce la lettura del thread principale stdin
Questo è un codice di esempio su ciò che sto facendo con due thread.
#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();
}
Ecco i miei parametri di compilazione:
g++ -std=c++0x -o main main.cc -lpthread -lglfw
Il mio computer portatile Esegui questo programma, come questo:
init
inited
render
render
q
user input: q
user interrupt
quit
e workstation uscite solo:
init
inited
render
render
q
render
q
render
q
render
^C
E 'solo semplicemente ignorato i miei input (un altro progra La stessa procedura con glew e glfw, basta saltare fuori dal ciclo while nel thread principale, senza leggere i miei input.) MA questa cosa funziona normalmente con gdb!
qualche idea di cosa sta succedendo?
Aggiornamento
Dopo altri test su altri computer, il driver NVIDIA ha causato questo. La stessa cosa accade su altre macchine con la scheda grafica NVIDIA.
Provare a fare 'g_run' a' std :: atomic 'piuttosto che un semplice' bool'. –
ildjarn
provato e non funziona. in questo caso non esiste una condizione di competizione, poiché solo un thread sta scrivendo su di esso. – xiaoyi
Un thread sta scrivendo mentre un altro sta leggendo. Hai ** bisogno ** di una barriera di memoria. – ildjarn