jjzjj

c - 最近的 GTK 3.22 是否仍然对 Boehm GC 友好(线程问题)?

coder 2023-06-16 原文

Boehm's conservative garbage collector非常有用(例如 Bigloo 正在使用它,Guile 正在使用类似的东西,等等......),特别是在 Linux 上(这是我唯一关心的操作系统;我正在使用 Debian/Sid/x86- 64 如果这很重要,libgc-dev 包是版本 1:7.4.2-8 所以 Boehm GC 是 7.4.2)。

但是,Boehm 的 GC 需要了解每个使用它的线程。它的gc_pthreads_redirects.h (或多或少是内部的)头文件正在将pthread_create重新定义为

# define pthread_create GC_pthread_create

其实Boehm的GC需要的是GC_register_my_thread在新线程调用栈的早期调用(GC_pthread_create 正在这样做)。

过去,Glib (2.46) 提供了一种使用 struct GMemVTable which is deprecated 重新定义内存分配的方法。 并且无法再使用(我的 Debian 的 libglib2.02.0-dev 软件包版本为 2.50.3-2)。有一个g_mem_gc_friendly global boolean但是当查看 Glib 源代码时,它只是在释放内存区域之前清除它们。

最近的 GTK3(我的 libgtk-3-dev 包的版本为 3.22.11-1)正在创建线程(可能与 Dbus 相关,也可能与GtkTextView...) 使用(间接)pthread_create 通过 Glib thread functions .并且没有办法(除非通过修补源代码)被通知该线程创建。我担心我安装的任何 GTK 回调(例如使用 g_signal_connect )可能会从这些线程调用。或者,如果我使用某些可能使用(或访问)某些 GC_malloc 缓冲区的方法对 GTK 小部件进行子类化,则可能会发生灾难。

另一方面,GTK 中有一个严格的编码规则,即所有 GTK 操作都应该只在主线程中发生。引用Gdk3 Threads页:

GTK+, however, is not thread safe. You should only use GTK+ and GDK from the thread gtk_init() and gtk_main() were called on. This is usually referred to as the “main thread”.

如果我自己遵守这条规则,我确信没有内部 GTK 代码会从某个非主线程调用我的回调(使用 Boehm GC)?

我的直觉是,如果 GC_alloc 被 GTK 内部从主线程外部调用(不是直接被我的代码调用),就会发生灾难 (因为这些 GTK 内部线程还没有用 GC_pthread_create 启动;可能会调用我的一些代码,例如,因为我正在子类化一些现有的 GTK 小部件,或者因为我连接了一些 GTK 信号,即使我不要自己在主线程之外使用 GTK 和 Boehm GC 编写代码。)。

重点是 Boehm 的 GC 需要扫描每个可能使用它的线程中的每个堆栈。

FWIW,我报告了一个可能的 bug#780815在 GTK bugzilla 上。

一个典型的例子是来自 GTK-3.22.11 tarball 的 gtk+-3.22.11/examples/application9/pthread_create is called g_application_run 通过 g_bus_get_sync

非常间接地执行

最佳答案

Gtk 不会从非主线程调用任何信号处理程序。您在 Gtk 应用程序中找到的任何工作线程都通过消息队列与主线程交互。您可以在 Glib 源代码中看到这一点。例如,参见 gdbusconnection.cg_dbus_connection_signal_subscribe()schedule_callbacks() 的实现。 .(工作线程调用 g_source_attach(..., subscriber->context),其中第二个参数是 g_main_context_ref_thread_default() 返回的内容。)

因此您不需要使用g_mem_set_vtable() 覆盖内存分配例程。如果您以前这样做过,那将是一个非常糟糕的设计,您将 GLib/Gtk 中完美的手动内存管理实现替换为自动但不完善(且不稳定)的内存管理方案 Boehm GC。

关于c - 最近的 GTK 3.22 是否仍然对 Boehm GC 友好(线程问题)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43141659/

有关c - 最近的 GTK 3.22 是否仍然对 Boehm GC 友好(线程问题)?的更多相关文章

  1. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  2. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  3. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  4. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  5. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  6. ruby - Fast-stemmer 安装问题 - 2

    由于fast-stemmer的问题,我很难安装我想要的任何ruby​​gem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=

  7. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  8. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

    我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

  9. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  10. ruby - 检查日期是否在过去 7 天内 - 2

    我的日期格式如下:"%d-%m-%Y"(例如,今天的日期为07-09-2015),我想看看是不是在过去的七天内。谁能推荐一种方法? 最佳答案 你可以这样做:require"date"Date.today-7 关于ruby-检查日期是否在过去7天内,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/32438063/

随机推荐