我正在嘗試編寫一個使用C++ 11多線程的gtkmm應用程序。但是,我不斷遇到Fatal IO error 11 (Resource temporarily unavailable) on X server
錯誤。如何打擊多線程gtkmm應用程序中的「X服務器上的致命IO錯誤11(資源暫時不可用)」?
我在窗口上有幾個Gtk::Image
對象。每個人都在自己的Gtk::EventBox
和定期我必須改變圖像。爲此,我創建了一個保存特定塊的事件框的類,它具有刪除前一圖像的功能,生成新圖像並將其放置在那裏。
下面是一個代碼塊:
while (lock_flag.test_and_set()) {} // std::atomic_flag lock
// ...
std::cerr << 1;
eventBox->foreach(
[eb = this->eventBox](Gtk::Widget& w)
{
eb->Gtk::Container::remove(w);
}
);
std::cerr << 2;
eventBox->add(*im);
std::cerr << 3;
eventBox->show_all_children();
std::cerr << 4;
// ...
lock_flag.clear();
當error 11
出現一些數字沒有得到打印到std::cerr
,但問題出在哪裏發生的事情是每次都不同(我最近觀察到其崩潰12後在123之後)。因此,我得出結論:某處使用的資源不是圖像,而是eventBox
。但是在程序初始化之後,它不能在這個函數之外的任何地方訪問,並且這個函數被鎖定爲std::atomic_flag
。
問題:什麼可能是此類行爲的原因?我能確保它不會發生嗎?或者我可以捕獲這個錯誤,並期望從中恢復?
編輯:
我試圖
- 我試圖使用
std::thread
到Glib::Threads::Thread
改變,但無濟於事,仍然得到同樣的錯誤。 - 已讀this我試圖將
GDK_SYNCHRONIZE
添加到環境中,這已生成[xcb] Unknown request in queue while dequeuing/[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
錯誤。這導致我this post,之後我試圖在啓動新線程前(通過Glib::Threads::Thread
和std::thread
)呼叫XInitThreads()
,但這沒有任何好處;除了一次通過一些僥倖實際上線程已經執行了整個功能(在屏幕上顯示'4'),但是仍然設法以相同的error 11
消息去死。