Кажется, что это связано с платформой (работает с Ubuntu 12.04 на моем ноутбуке, не работает с другим Ubuntu 12.04 на моей рабочей станции).C++ 11 <thread> многопоточность рендеринга с OpenGL предотвращает чтение основного потока stdin
Это пример кода о том, что я делаю с двумя потоками.
#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 в основном потоке, не читая мои входы.) BUT эта вещь работает нормально с gdb!
любая идея о том, что происходит?
Update
После нескольких тестов на других машинах, драйвер NVIDIA, это вызвано. То же самое происходит на других машинах с графической картой NVIDIA.
Попробуйте сделать 'g_run' a' std :: atomic 'вместо простого' bool'. –
ildjarn
пробовал и не работает. в этом случае нет гоночных условий, так как на него пишет только один поток. – xiaoyi
Один поток пишет, а другой читает. Вы ** нуждаетесь в ** барьер памяти. – ildjarn