GSubprocess 可以安全地在线程中使用吗?

Posted

技术标签:

【中文标题】GSubprocess 可以安全地在线程中使用吗?【英文标题】:Can GSubprocess be used in a thread safely? 【发布时间】:2022-01-10 18:22:18 【问题描述】:

我在使用 GtkSubprocess 时遇到了一些问题,我发现它与使用线程有关,有没有办法让它不受并发问题的影响? 我有这个程序对文件执行一些操作,这些操作分别由 GtkListBoxRows 表示。当 GSubprocess 完成并且我尝试删除列表框行时,程序会出现段错误。顺便说一句,每个文件都有自己的进程,所以如果用户加载 10 个文件,就会有 10 个线程(这是由 GThreadPool 管理的)。有趣的是,如果我注释掉启动进程的代码,以及阻塞线程函数直到进程完成的代码,程序不会出现段错误。所以我推断GSubprocess 存在并发问题。产生的误差变化很大,所以这一定是由于时间相关的问题。 我想使用GSubprocess,因为它相对容易获得我需要的命令输出。我是否需要将 GSubprocess 调用移到线程函数之外?

【问题讨论】:

您链接的问题从未提及 GSubprocess,仅提及 Python 特定的 subprocess 模块(不基于 Gtk gsubprocess)。 【参考方案1】:

我发现它不安全,因为它在 GTK+ 源代码中的内部实现。正如here 所述,您甚至不应该在应用程序中使用线程。这是我的解决方法:在主循环中创建进程,然后使用调用的async 版本等待进程终止。因此,您可以避免线程。

【讨论】:

以上是关于GSubprocess 可以安全地在线程中使用吗?的主要内容,如果未能解决你的问题,请参考以下文章

安全地在前后端之间传输数据 - 「3」真的安全吗?

我可以使用 boost::threadpool 作为“线程安全队列”吗?

我们可以在方法中使用 AtomicInteger 作为局部变量并实现线程安全吗?

使用volatile修饰int型变量i,多个线程同时进行i++操作,这样可以实现线程安全吗

SSLContext 和 SSLSocketFactory createSocket 线程安全吗?

在 C# 中使用 Interlocked 获取和设置线程安全吗?