为啥 gtkmm 有时会自动创建第二个线程?

Posted

技术标签:

【中文标题】为啥 gtkmm 有时会自动创建第二个线程?【英文标题】:Why does gtkmm automatically create a second thread sometimes?为什么 gtkmm 有时会自动创建第二个线程? 【发布时间】:2014-01-27 23:56:07 【问题描述】:

如果我按原样编译和运行代码,该进程将使用 1 个线程运行。如果我取消注释已注释掉的部分,然后编译并运行它,它会以 2 个线程运行。

我正在使用以下命令编译代码: g++pkg-config gtkmm-2.4 --cflags --libstest.cpp

当程序运行时,我可以检查创建了多少线程: ps -mC a.out

如果我查看 ddd 中的第二个线程,我可以看到它正在运行 g_main_loop_run。这让我很困惑:

这个帖子的目的是什么? 为什么添加工具栏按钮会创建一个新线程? 我认为 g_main_loop_run() 应该只在一个线程中运行(除非您使用 GDK_THREADS_ENTER/GDK_THREADS_LEAVE 宏)。由于我在主线程中运行 Gtk::Main::Run() 违反了规则?

提前感谢您的帮助。快把我逼疯了。

#include <gtkmm.h>

bool OnDeleteEvent(GdkEventAny* PtrGdkEventAny)

    Gtk::Main::quit();
    return(true);


void OnExecuteButtonClicked()



int main(int argc, char *argv[])

    new Gtk::Main(0, NULL);

    Gtk::Window *ptrWindow = new Gtk::Window;
    ptrWindow->signal_delete_event().connect(sigc::ptr_fun(&OnDeleteEvent));

    /*
    Gtk::Toolbar *ptrToolBar = manage(new Gtk::Toolbar);
    Gtk::ToolButton *ptrToolButton;

    ptrToolButton = manage( new Gtk::ToolButton(Gtk::Stock::EXECUTE));
    ptrToolBar->append(*ptrToolButton, sigc::ptr_fun(&OnExecuteButtonClicked));

    ptrWindow->add(*ptrToolBar);
    */

    ptrWindow->show_all();
    Gtk::Main::run();

    return (0);

【问题讨论】:

“我认为 g_main_loop_run() 应该只在一个线程中运行(除非你使用 GDK_THREADS_ENTER/GDK_THREADS_LEAVE 宏)”——这句话真的没有意义。当然,主循环和回调在一个线程中运行,但不能保证在后台只使用一个线程。 好的,所以我想答案是“不要担心其他线程,它不会影响你”。我做了一个小实验,以确保从未使用其他线程的 ThreadId 调用回调,而实际上它们没有。这是我主要关心的问题。我猜 Gtk 可能使用另一个线程来提高性能。感谢您的回复。 【参考方案1】:

有时GThreads 是在您使用依赖异步行为的函数时创建的。这些通常在内部创建一个GTask(与g_task_run_in_thread 和朋友一起)并在单独的线程中运行同步版本(除了那些天生异步或异步的,那些通常不会产生另一个线程)。通常这是 IO(即 GtkBuilder)、Socket 和 IPC (dbus) 相关的 - 所以主要是 glib 的东西。

可能还有一些我不知道的情况,会产生额外的线程,主循环本身是严格的单线程。

因此,在您的情况下,我只能想到两件事可能会触发此问题:从本地磁盘加载的 Stock 图像或主题的样式信息。

【讨论】:

以上是关于为啥 gtkmm 有时会自动创建第二个线程?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的第二个按钮在使用自动布局约束时表现不同?

css为啥有时候创建div是块的高度为0无法把div下面的内容包含进去就像下面这例子

gtkmm & glade - 多个窗口不工作

为啥有时会立即释放内存,而有时仅在自动释放池耗尽时才释放内存?

自动布局 - 为啥“垂直间距”有时会附加到视图的另一侧?

如何创建第二个主列(自动增量)[重复]