草庐IT

Reentrancy

全部标签

c# - C# 中的线程和静态方法

这里以一个无意义的扩展方法为例:publicstaticclassMyExtensions{publicstaticintMyExtensionMethod(thisMyTypee){intx=1;x=2;returnx}}假设一个执行线程完成并包括以下行:x=2;处理器然后上下文切换,另一个线程进入相同的方法并完成该行:intx=1;我是否正确地假设第一个线程创建和分配的变量“x”与第二个线程创建和分配的变量“x”位于单独的堆栈上,这意味着该方法是可重入的? 最佳答案 是的,每个线程都有自己独立的局部变量。即使被多个线程同时调用,

c# - SemaphoreSlim (.NET) 是否阻止同一线程进入 block ?

我已经阅读了SemaphoreSlim的文档SemaphoreSlimMSDN这表明如果您将SemaphoreSlim配置为:SemaphoreSlim_semaphoreSlim=newSemaphoreSlim(1,1);但是,它并不表示它是否会阻止相同线程访问该代码。这与async和await一起出现。如果在方法中使用await,则控制离开该方法并在任何任务或线程完成时返回。在我的示例中,我使用带有异步按钮处理程序的按钮。它使用“await”调用另一个方法(Function1)。Function1依次调用awaitTask.Run(()=>Function2(beginCount

c# - 在其回调方法中停止计时器

我有一个System.Threading.Timer,它每10毫秒调用一次相应的事件处理程序(回调)。该方法本身不可重入,有时可能会超过10毫秒。因此,我想在方法执行期间停止计时器。代码:privateTimer_creatorTimer;//BackgroundWorker'sworkprivatevoidCreatorWork(objectsender,DoWorkEventArgse){_creatorTimer=newTimer(CreatorLoop,null,0,10);//someothercodethatworkerisdoingwhilethetimerisactiv

javascript - JavaScript 中的重入

我想提高对可重入这个词的理解。这个函数是可重入的吗?function*foo(){yield1;yield2;}还有这个?functionfoo(){return1;}还有这个?varx=0;functionfoo(){returnx++;}还有这个?functionfoo(){setTimeout(foo,1000);} 最佳答案 可重入函数是可以恢复执行的函数:Incomputing,acomputerprogramorsubroutineiscalledreentrantifitcanbeinterruptedinthemid

Solidity - 安全 - 重入攻击(Reentrancy)

TheDAO事件首先简要说明下一个很有名的重入攻击事件,再模拟重入攻击。TheDAO是分布式自治组织,2016年5月正式发布,该项目使用了由德国以太坊创业公司Slock.it编写的开源代码。2016年6月17上午,被攻击的消息开始在社交网站上出现,到6月18日黑客将超过360万个以太币转移到一个childDAO项目中,childDAO项目和TheDAO有着一样的结构,当时以太币的价格从20美元降到了13美元。当时,一个所谓的”递归调用“攻击(现在称为重入攻击)名词随之出现,这种攻击可以被用来消耗一些智能合约账户。这次的黑客攻击最终导致了以太坊硬分叉,分为ETH和ETC,分叉前的为ETC(以太坊

java - 在 Java 中使用什么策略进行分层可重入读/写锁定?

我正在寻找一个高效的系统来拥有一系列按层次组织的读/写锁,以管理对按层次组织的资源的访问。如果一个子树被锁定为写,那么在它被释放之前,整个子树都不能获得其他锁;类似地,子树中的写锁应该防止在父树中锁定。以下是我正在考虑的想法:使用ApacheCommonsTransaction。不幸的是,该项目自2008年3月以来一直没有更新,并已非正式终止。一些API文档似乎表明即将发布的版本(1.3或2.0)将包括somekindofhierarchicallocking,但找不到源代码,而且我们似乎无法再访问他们的SVN存储库。使用一系列ReentrantReadWriteLocks,我会分层组

java - Java 的可重入锁和死锁

有人可以用Java代码(伪)示例向我解释一下Reentrantlock和deadlock是如何相互关联的吗? 最佳答案 可重入锁定机制允许持有锁的线程重新进入临界区。这意味着您可以执行以下操作:publicsynchronizedvoidfunctionOne(){//dosomethingfunctionTwo();//dosomethingelse//redundant,butpermitted...synchronized(this){//domorestuff}}publicsynchronizedvoidfunctionT

c++ - memcpy() 函数是可重入的吗?

我在信号处理程序中调用了一些C++函数,但我的程序因段错误而终止。当我检查gdb时,memcpy()函数是我获得SIGSEGV的地方。我想知道memcpy()是否是可重入函数? 最佳答案 在除了最高度嵌入的平台之外的所有平台中,它都是可重入的。你提到SIGSEGV所以我认为它不是其中之一。在这种情况下,很可能memcpy()不是罪魁祸首:这是调用者的错。如果您要求memcpy()复制错误的指针(或错误的长度),那么它就会出错。你可以很容易地做到这一点:memcpy(NULL,NULL,123456789);这会导致SIGSEGV,它

android - UriMatcher 类的 match(Uri) 是否可重入?

我看到的关于如何制作ContentProvider的示例都用过UriMatcher#match(Uri)insert、query、update和delete方法中的方法可以轻松处理所有URI模式内容提供商响应(例如:http://developer.android.com/resources/samples/NotePad/src/com/example/android/notepad/NotePadProvider.html)。这对我来说似乎没问题,直到今天,当我在ContentProviderAPI文档中注意到insert、query、update和delete“可以[全部]从多个

c++ - 为什么这段代码被认为是可重入的?当操作系统中断线程时究竟发生了什么?

这是IBM认为可重入的一段代码:/*reentrantfunction(abettersolution)*/char*strtoupper_r(char*in_str,char*out_str){intindex;for(index=0;in_str[index];index++)out_str[index]=toupper(in_str[index]);out_str[index]=0returnout_str;}对我来说这段代码是不可重入的,因为循环计数器的索引是在本地定义的。如果操作系统在循环内中断此线程,而另一个线程调用此函数,则索引将丢失。我错过了什么?为什么这段代码被认为是
12