几个星期前我有一堂课,我的解决方案很好,但是当观察它更长时间时,我注意到了一些奇怪的行为。 该练习使用两个posix线程产生死锁,然后解决它。 (我抽象的解决方案,因此它没有任何不必要的代码解决死锁时的奇怪行为
的场景如下:
- 我有谁共享两个虚构的资源两个线程
- 两个线程启动序列,然后设法占领这两个资源(按顺序太)
- 两个线程都拥有占领
- 当一个线程都有他的作品持续5秒两种资源不同的时间跨度,然后释放该资源,并在他再次开始需要休息,当断则试图占据这两个资源
- 每8秒功能checkes如果两个线程都等待状态(这两个线程都一个资源,并等待第二次)
- 死锁时occures,谁的工作更线程得到取消,然后重新启动
问题出在这里,这取决于机器和编译器标记输出说,例如线程A被取消,但线程B启动。我用不同的编译器在不同的计算机上试过它,并使用不同的关系。 奇怪的是,我编译gcc -Wall -Werror -ansi -pedantic -D_POSIX_C_SOURCE=200809L -pthread -lrt
,并与第二死锁问题occures,但是当我删除-Wall和-Werror问题自带的3僵局0O
我上传的源here。编译标志位于源代码中,我尝试了gcc和clang。 我也试过Ubuntu 13.04和Arch。
Here是输出,我用“ - >”标记了行
我忘记了一些东西,所以这个效果出现了吗?我不认为在某些库中有错误。
我没有得到你同样的效果。你可以发布你看到的输出吗? –