GSubprocess 可以安全地在线程中使用吗?
Posted
技术标签:
【中文标题】GSubprocess 可以安全地在线程中使用吗?【英文标题】:Can GSubprocess be used in a thread safely? 【发布时间】:2022-01-10 18:22:18 【问题描述】:我在使用 GtkSubprocess 时遇到了一些问题,我发现它与使用线程有关,有没有办法让它不受并发问题的影响?
我有这个程序对文件执行一些操作,这些操作分别由 GtkListBoxRow
s 表示。当 GSubprocess 完成并且我尝试删除列表框行时,程序会出现段错误。顺便说一句,每个文件都有自己的进程,所以如果用户加载 10 个文件,就会有 10 个线程(这是由 GThreadPool
管理的)。有趣的是,如果我注释掉启动进程的代码,以及阻塞线程函数直到进程完成的代码,程序不会出现段错误。所以我推断GSubprocess
存在并发问题。产生的误差变化很大,所以这一定是由于时间相关的问题。
我想使用GSubprocess
,因为它相对容易获得我需要的命令输出。我是否需要将 GSubprocess 调用移到线程函数之外?
【问题讨论】:
您链接的问题从未提及 GSubprocess,仅提及 Python 特定的subprocess
模块(不基于 Gtk gsubprocess)。
【参考方案1】:
我发现它不安全,因为它在 GTK+ 源代码中的内部实现。正如here 所述,您甚至不应该在应用程序中使用线程。这是我的解决方法:在主循环中创建进程,然后使用调用的async 版本等待进程终止。因此,您可以避免线程。
【讨论】:
以上是关于GSubprocess 可以安全地在线程中使用吗?的主要内容,如果未能解决你的问题,请参考以下文章
我可以使用 boost::threadpool 作为“线程安全队列”吗?
我们可以在方法中使用 AtomicInteger 作为局部变量并实现线程安全吗?
使用volatile修饰int型变量i,多个线程同时进行i++操作,这样可以实现线程安全吗