如何在c++中避免多线程问题(wxWidgets和Cplex)

How to avoid multi-threading problems (wxWidgets and Cplex) in C++?

本文关键字:问题 wxWidgets Cplex 多线程 c++      更新时间:2023-10-16

我用c++编写了一个工具,使用wxWidgets作为GUI和IBM ILOG Cplex来解决一个优化问题。

在wx事件处理程序调用的一个函数中,我调用了IBM ILOG Cplex Optimizer,它本身就是多线程代码。

我意识到这会导致非合理内存内容的不确定性错误。

由于我没有编写多线程代码的经验,并且不想花三周时间学习如何编写多线程代码,所以我想知道:

是否有一些安全的,可能不太优雅的方法来避免这里的问题?(也许,这比将文件写入磁盘,通过操作系统调用不同的任务并将输出读入更优雅)。

从wx线程启动复杂线程是一个坏主意吗?

使用两个可能在内部使用不同库来实现多线程的库通常是一个坏主意吗?(我不知道除了pthreads之外还有什么,也不知道cplex或wx使用的是什么)

根据我的经验,规则是:

更改显示的每个wxWdiget函数调用必须在wxWidget线程中进行

我不太了解复杂,但如果你说它是多线程的,很可能你正在调用一个异步函数,你在回调中处理结果。回调绝对不是在wxWidget线程中调用的。如果您尝试在回调中显示结果,则违反了上述规则。这时就会出现一些小bug,在我的例子中通常表现为堆损坏。

要解决这个问题,必须将回调的结果传递给wxWidget线程,并在该线程中显示它们。有很多方法可以做到这一点,但全局机制是触发wxWigdet上的自定义事件,该事件被传递给wxWidget线程。

查看此链接,http://wiki.wxwidgets.org/Custom_Events您需要使用wxEvtHandler::AddPendingEvent(wxEvent& event)