【发布时间】:2015-07-12 10:52:14
【问题描述】:
我正在尝试编写一个使用 C++11 多线程的 gtkmm 应用程序。但是,我一直遇到Fatal IO error 11 (Resource temporarily unavailable) on X server 错误。
我的窗口上有几个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,之后我尝试在启动新线程之前调用XInitThreads()(通过Glib::Threads::Thread和std::thread),但这没有任何积极作用;除了一次侥幸,线程实际上已经执行了整个函数(在屏幕上显示“4”),但仍然设法以相同的error 11消息终止。
【问题讨论】:
标签: multithreading c++11 gtkmm