几周前我在课堂上做了一个练习,我的解决方案很好,但是在长时间观察时我发现了一些奇怪的行为。练习是用两个 posix 线程生成一个死锁,然后解决它。(我对解决方案进行了抽象,因此它没有不必要的代码。
场景如下:
- 我有两个线程共享两个虚构资源
- 两个线程按顺序启动,然后尝试占用两个资源(也按顺序)
- 两个线程有不同的占用时间
- 当一个线程拥有两种资源时,他工作 5 秒,然后释放资源并休息一下,当休息结束时,他再次开始尝试占用这两种资源
- 每 8 秒,一个函数检查两个线程是否处于等待状态(两个线程都有一个资源并等待第二个)
- 当发生死锁时,工作更多的线程将被取消然后重新启动
问题来了,取决于机器和编译器标志,输出表明例如线程 A 被取消,但随后线程 B 启动。我在不同的计算机上用不同的编译器和不同的安装进行了尝试。奇怪的是我编译时gcc -Wall -Werror -ansi -pedantic -D_POSIX_C_SOURCE=200809L -pthread -lrt
出现了第二个死锁问题,但是当我删除 -Wall 和 -Werror 时,问题出现在 3. deadlock 0o
我在这里上传了源代码。编译标志在源代码中,我尝试了 gcc 和 clang。我还尝试了 Ubuntu 13.04 和 Arch。
这是输出,我用“-->”标记了这些行
我是不是忘记了什么,所以出现了这种效果?我认为某些库中没有错误。