यह प्लेटफॉर्म से संबंधित है (मेरे लैपटॉप पर उबंटू 12.04 के साथ काम करता है, मेरे वर्कस्टेशन पर एक और उबंटू 12.04 के साथ काम नहीं करता है)।सी ++ 11 <thread> ओपनजीएल के साथ प्रतिपादन मल्टीथ्रेड्स मुख्य थ्रेड को रोकता है stdin
यह एक नमूना कोड है जो मैं दो धागे के साथ कर रहा हूं।
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
यह सिर्फ
#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();
}
यहाँ मेरी संकलन पैरामीटर है बस मेरे इनपुट को नजरअंदाज कर दिया (एक और प्रोग्रा glew और glfw के साथ एक ही प्रक्रिया, मेरे इनपुट को पढ़ने के बिना, मुख्य धागे में बस लूप से बाहर कूदें।) लेकिन यह बात सामान्य रूप से gdb के साथ काम करती है!
क्या हो रहा है इसके बारे में कोई विचार है?
अद्यतन
अन्य मशीनों पर और अधिक परीक्षण के बाद, NVIDIA के ड्राइवर इस का कारण बना। एनवीआईडीआईए ग्राफिक्स कार्ड के साथ अन्य मशीनों पर भी यही बात होती है।
सादे 'बूल 'के बजाय' g_run' a 'std :: atomic' बनाने का प्रयास करें। –
ildjarn
कोशिश की और काम नहीं करता है। इस मामले में कोई रेसिंग स्थिति नहीं है, क्योंकि केवल एक धागा इसे लिख रहा है। – xiaoyi
एक धागा लिख रहा है जबकि दूसरा पढ़ रहा है। आपको ** ** एक स्मृति बाधा की आवश्यकता है। – ildjarn