c++ - 使用 boost::thread 崩溃

标签 c++ linux crash wxwidgets boost-thread

我将 wxwidgets 与 boost::thread 一起使用。 Thread 是一个工作线程,它向 GUI 发送一些事件:

线程创建:

thrd = boost::thread(boost::bind(workerFunction,this));

向 GUI 发送消息:

wxPostEvent(loWindow, event);
wxSafeYield();

在 Windows 下我没有看到任何问题,但是在 Linux (Ubuntu 8.10) 下启动应用程序时,它停止并显示以下错误消息:

_XCBUnlockDisplay: Assertion `xcb_get_request_sent(dpy->xcb->connection) == dpy->request' failed.
Aborted

我错过了什么?当 workerFunction 没有在线程中启动时,它可以正常工作。

问候, /mspoerr

最佳答案

不要从工作线程调用wxYield。只能从 GUI 线程执行此操作。 Yield 将处理 gui 事件,如果您在某些 GUI 事件处理程序中做了很多工作并且想要更新其他控件并处理其间的未决事件,则可以使用它。 wxSafeYield 中的Safe 意味着它在首先处理未决事件之前禁用 GUI 控件。这将保护您免受此类情况的影响,例如从第二次递归地进入您调用的事件处理程序 wxYield 。这并不意味着它是线程安全的或类似的东西。

如果您想将您的线程的剩余时间片分配给其他线程,请调用 wx 的 wxThread::Yield或提升的 this_thread::yield (取决于您的线程类)。

关于c++ - 使用 boost::thread 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1055643/

相关文章:

c++ - 没有初始化器的 constexpr 静态数据成员

c++ - 配置Qt5.5.1时包含和排除qt模块和插件

c - Posix 线程 ID 是否与 linux 线程 ID 具有一对一关系?

linux - 如何包含管道 |在我的 linux 中找到 -exec 命令?

Linux 脚本不起作用

ios - Facebook SDK [FBAppEvents activateApp]随机崩溃

java - 从启动画面切换到 MainActivity 时应用程序崩溃

c++ - lisp 中的类

IOs7 应用程序在后台崩溃

c++ - 如何更改 CTabCtrl 选项卡颜色?