我正在寻找一种并发算法,它可以帮助我检测有向图中的周期.
我知道顺序算法使用带着色的dfs,但我认为它会在多线程环境中失败.有向图的一个例子来说明它:
A - >(B,C),B->(D),D->(E),C->(E),E->(F)
A
/ \
B C
| |
D |
\ /
E
|
F
Run Code Online (Sandbox Code Playgroud)
(我希望上面说清楚.图中的边缘都是顶部的)
对于上述有向图,在并发执行期间可以执行以下操作.
(我假设的着色方案是白色 - 未访问,灰色 - 执行dfs未完成和黑色 - 完成执行和访问)
Dfs(B)由线程1,最终将E颜色为灰色并执行dfs(E)(导致F).在此之前,线程2执行dfs(C).它意识到E是灰色的并报告一个明显不是这种情况的循环.
我检查过Tarjan的算法也可以用于循环检测,但我不认为它的执行在多线程环境中是正确的.
有人可以帮我解决这个问题吗?
谢谢.
我无法与超越比较4进行3向合并以解决任何git冲突.当有冲突我输入
git mergetool
Run Code Online (Sandbox Code Playgroud)
它打开一个超越比较选项卡,但不是三向合并它的普通差异视图.
Beyond Compare的版本是4.1.3版(64位).git的版本是git版本2.7.1.windows.1,我在Windows 7上.gitconfig的相关部分是
[diff]
tool = bc3
[difftool "bc3"]
path = 'c:/Program Files/Beyond Compare 4/bcomp.exe'
[merge]
tool = bc3
[mergetool "bc3"]
path = 'c:/Program Files/Beyond Compare 4/bcomp.exe'
cmd = 'c:/Program files/Beyond Compare 4/bcomp.exe' "$LOCAL" "$REMOTE" "$BASE" "$MERGED"
Run Code Online (Sandbox Code Playgroud)
我曾尝试按照http://www.scootersoftware.com/support.php?zz=kb_vcs#gitwindows上的说明进行操作,但它没有解决问题.你能帮帮我吗?谢谢
我之前使用 PHP 和 AJAX 编写了一个简单的聊天应用程序。这样,一旦用户发送聊天,它首先会转到 php 并从那里保存在数据库中。我在客户端使用 AJAX 定期查询数据库以获取新消息。我最终在 .
所以在我的客户端代码中,我有一个 recMsg 变量,我已将其设置为
recMsg = recMsg + value['chattime'] + ' <@' + value['chatby'] + '> ' + value['chat'] + '\r\n';
Run Code Online (Sandbox Code Playgroud)
其中 value 是一个数组,其中 value['chat'] 具有实际的聊天消息。
后来我设置文本区域如下
$('#received').val(recMsg + $('#received').val());
Run Code Online (Sandbox Code Playgroud)
其中收到的是标签的 ID。textarea 的代码(当我在浏览器中查看源代码时)是
<textarea id="received" rows="15" cols="150"></textarea>
Run Code Online (Sandbox Code Playgroud)
现在尝试 xss 攻击,我输入以下内容作为我的聊天内容
</textarea>
<script>
alert("Hi");
</script>
<textarea>
Run Code Online (Sandbox Code Playgroud)
但它没有向我显示警告框,它只是在 textarea 中显示完整消息以及标签(它不会将任何标签视为特殊标签,而只是将它们视为要显示的普通文本)。我尝试更改 javascript 这样的 recMsg 只是聊天消息,也尝试使用 .innerHTML 但没有成功。
所以我的问题是 1) 攻击是否失败是因为我在呈现 textarea 后更改了它的值?
2)是否可以通过这种方式进行XSS。如何更改 javascript 代码以启用此攻击?
3) 无关问题——当我使用 AJAX 更改 DOM 元素时,如果查看源代码,我看不到任何更改(例如,在我收到几次聊天后,textarea 仍然是空的)。为什么会这样?
感谢您的回复
首先让我说我没有Perl的深入知识所以请原谅我,如果有一些明显我错过了:)
在我正在查看的系统(在Windows环境中运行)中,我们有一个perl进程,必须下载~5000-6000个文件.由于每个文件都可以独立下载,因此我们为每个文件分叉了不同的线程.线程应该下载文件并死掉.在运行该过程时,我注意到该进程的内存高达~1.7 GB,然后由于每个进程的内存限制而死亡.
在搜索和询问一些人时,我遇到了循环引用的概念,因为垃圾收集器不会释放内存.我搜索了一下,找到了Devel-Cycle可以找出对象中是否有任何循环的包.我得到了这个包并添加了一行来检查进程中的主要对象是否有任何循环.find_cycle为每个线程返回以下语句.
DBD::Oracle::db FIRSTKEY failed: handle 2 is owned by thread 256004 not current thread c0ea29c (handles can't be shared between threads and your driver may need a CLONE method added) at C:/Program Files/Perl/site/lib/Devel/Cycle.pm line 151.
Run Code Online (Sandbox Code Playgroud)
我知道线程之间不能共享DB句柄.我再次查看代码并意识到在fork发生之后,子进程实际上创建了一个新的DB句柄(我想这就是为什么进程仍然继续正常运行直到达到内存限制).我想可能会有更多来自对象中父级的数据库句柄,这些句柄未被子级使用但仍被引用.
我有的Questons -
循环引用是问题的唯一原因还是会有其他问题导致进程使用如此多的内存?
共享句柄会导致内存爆炸(换句话说是共享DB句柄导致GC不释放空间)?
如果它确实是共享数据库句柄,我想我可以说$dbHandle = 0要摆脱引用(如果$dbHabndle引用该特定句柄).我在这里纠正吗?
我试图通过代码来查看其他地方有对父DB句柄的引用(并找到至少一个更多的引用).有没有其他方法可以做到这一点?有没有方法可以打印出对象的所有属性?
编辑: 并非所有线程(由于Windows中的perl fork调用)同时生成.它产生最多n个线程(其中n是可配置的数字).一旦线程完成执行,该过程就会产生另一个线程.此时n设置为10,但是我将n更改为1(因此一次只运行一个额外的线程),我仍然达到了内存限制.