我有一个多线程程序,其中我无条件地在一个线程(线程 A)中休眠无限时间。当另一个线程(Thread B)中发生事件时,它通过发信号唤醒 Thread-A。现在我知道有多种方法可以做到这一点。 当我的程序在windows环境下运行时,我在Thread-A中使用WaitForSingleObject,在Thread-B中使用SetEvent。它工作正常。 我还可以使用基于文件描述符的模型进行轮询、选择。有不止一种方法可以做到这一点。 但是,我试图找到最有效的方法。我想在 Thread-B 发出信号时尽快唤醒 Thread-A。你认为什么是最好的选择。 我可以探索基于驱动程序的选项。
谢谢
最佳答案
如前所述,在线程 B 中触发 SetEvent 并在线程 A 中触发 WaitForSingleObject 速度很快。
但是,必须考虑一些条件:
单核/处理器:正如 Martin 所说,等待线程将抢占信号线程。使用这样的方案,您应该注意信号线程 (B) 在 SetEvent 之后立即进入空闲状态。例如,这可以通过 sleep(0) 来完成。
多核/处理器:有人可能认为将两个线程放在不同的内核/处理器上会有优势,但这并不是一个好主意。如果两个线程都在同一个核心/处理器上,则调用 SetEvent 和 WaitForSingleObject 返回之间的时间跨度要短得多。
在一个核心上处理两个线程 (SetThreadAffinityMask) 还允许通过优先级设置 (SetThreadPriority) 来处理它们的行为。您可以以更高的优先级运行等待线程,或者您必须确保信号线程在设置事件后确实没有做任何事情。
您必须处理其他一些同步问题:下一个事件何时发生?线程A会完成它的任务吗?最有效的是可以使用第二个事件来解决这个问题:当线程 A 完成后,它设置一个事件以指示允许线程 B 再次设置它的事件。线程B会有效的先设置事件,然后等待反馈事件,满足立即空闲的要求。
如果您希望允许线程 B 在线程 A 未完成且尚未处于等待状态时设置事件,则应考虑使用信号量而不是事件。这样,来自线程 B 的“调用/事件”的数量将被保留,并且线程 A 中的等待函数可以跟进,因为它返回信号量已被释放的次数。信号量对象与事件一样快。
总结:
通过 SetThreadAffinityMask 让两个线程在同一个核心/cpu 上。
通过另一个事件扩展 SetEvent/WaitForSingleObject 以建立握手。
根据处理的细节,您还可以考虑 semaphore objects .
关于c - 在事件中 sleep ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11748979/
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).
这是我在ActiveAdmin中的自定义页面ActiveAdmin.register_page"Settings"doaction_itemdolink_to('Importprojects','settings/importprojects')endcontentdopara"Text"endcontrollerdodefimportprojectssystem"rakedataspider:import_projects_ninja"para"OK"endendend我想做的是,当我单击“导入项目”按钮时,我想在Controller中执行rake任务。但是我无法访问该方法。可能是什
例如,假设我有一个名为Products的模型,并且在ProductsController中,我有以下代码用于product_listView以显示已排序的产品。@products=Product.order(params[:order_by])让我们想象一下,在product_listView中,用户可以使用下拉菜单按价格、评级、重量等进行排序。数据库中的产品不会经常更改。我很难理解的是,每次用户选择新的order_by过滤器时,rails是否必须查询,或者rails是否能够以某种方式缓存事件记录以在服务器端重新排序?有没有一种方法可以编写它,以便在用户排序时rails不会重新查询结果
我有一个将某些事件写入队列的Rails3应用。现在我想在服务器上创建一个服务,每x秒轮询一次队列,并按计划执行其他任务。除了创建ruby脚本并通过cron作业运行它之外,还有其他稳定的替代方案吗? 最佳答案 尽管启动基于Rails的持久任务是一种选择,但您可能希望查看更有序的系统,例如delayed_job或Starling管理您的工作量。我建议不要在cron中运行某些东西,因为启动整个Rails堆栈的开销可能很大。每隔几秒运行一次它是不切实际的,因为Rails上的启动时间通常为5-15秒,具体取决于您的硬件。不过,每天这样做几
我有一个帖子属于城市的关系,城市又属于一个州,例如:classPost现在我想找到所有帖子及其所属的城市和州。我编写了以下查询来获取带有城市的帖子,但不知道如何在同一查找器中获取带有城市的相应州:@post=Post.find:all,:include=>[:city]感谢任何帮助。谢谢。 最佳答案 Post.all(:include=>{:city=>:state}) 关于ruby-on-rails-使用Rails事件记录获取二级模型,我们在StackOverflow上找到一个类似的问
我觉得我错过了什么。我正在编写一个rubygem,它允许与事件记录进行交互,作为其主要功能的附加功能。在为其编写测试用例时,我需要能够指定虚拟事件记录模型来测试此功能。如果我可以获得一个事件记录模型的实例,它不需要与数据库的任何连接,可以有关系,所有这些东西,但不需要我在数据库中设置表,那就太棒了。我对测试还很陌生,在Rails测试之外我也很陌生,但似乎我应该能够相当轻松地完成类似的事情,但我什么也没找到。谁能告诉我我错过了什么?我看过工厂、制造商、固定装置,所有这些似乎都想达到目标。人们如何在您只需要AR对象进行测试的地方测试gem? 最佳答案
我想创建一个模块,为从事件记录库继承的类提供一些通用方法。以下是我们可以实现的两种方式。1)moduleCommentabledefself.extended(base)base.class_evaldoincludeInstanceMethodsextendClassMethodsendendmoduleClassMethodsdeftest_commentable_classmethodputs'testclassmethod'endendmoduleInstanceMethodsdeftest_commentable_instance_methodputs'testinstanc
有什么显着的区别吗sleep10和wait_until(10)他们似乎都在做同样的事情:WAITING10秒,然后继续下一步 最佳答案 sleep在指定时间内什么都不做。wait_untiltakesablock.它一直等到block评估为真或超时。如果没有给出block,它们的行为相同。 关于ruby-Watir...sleep和等待之间的区别,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/que
我有以下模型:activity.rbtag.rbtagging.rb标签是事件和标签的连接模型。我想搜索具有2个或更多标签的事件。我如何在Rails中执行此操作?例如:我有tag1=Christmas,tag2=Florida,tag3=John如果存在,我想找到tag1、tag2和tag3存在的Activity。[编辑]我最终做了什么:tags=[tag1,tag2,tag3]activities=[]tags.eachdo|tag|activities如果任何组值的大小等于tags.size,则该事件包含所有标签。 最佳答案 如