我编写了这个简单的测试程序,有时会触发“调试中断”,或者只是崩溃(在Debug / Win32 / VS2010SP1下)-当然,有时它甚至可以工作。我做错了什么还是PPL(VS2010)中的某个地方有错误?

#include "stdafx.h"
#include <ppl.h>
#include <vector>

int _tmain(int argc, _TCHAR* argv[])
{
    std::vector<int> vi;
    Concurrency::critical_section cs;
    Concurrency::parallel_for(0, 10000, [&](int i)
    {
        Concurrency::critical_section::scoped_lock l(cs);
        vi.push_back(i);
    });
    return 0;
}

调试中断调用堆栈如下所示:



我刚发生的一次崩溃看起来好像锁没有被锁住(cs:not_locked)

Lockable.exe!std::vector>::_ Orphan_range(int * _First = 0x0000c5db,int * _Last = 0x0000c5db)行1442 + 0x5字节C++
Lockable.exe!std::vector>::push_back(const int&_Val = 4177)行995 C++



而且即使在PPL内部实现中,也可能存在其他随机访问冲突,我想您可以复制。 (希望)

我在Visual Studio 2012 Express for Desktop下运行了同一程序,经过多次测试运行后,一切似乎都正常运行。

我想知道VS2010下的PPL是否在生产环境中无法使用?

感谢您的任何投入!

最佳答案

因此,最后,在Microsoft Connect(或Social?)上发布问题后,已经对问题进行了彻底的解释。

http://social.msdn.microsoft.com/Forums/en-US/parallelcppnative/thread/9601a2d0-b1ef-4d81-8743-73c3965a7b63

http://social.msdn.microsoft.com/Forums/eu/parallelcppnative/thread/38d2e8c8-e863-4da0-a45a-9776ab27feed

关于c++ - PPLcritical_section/parallel_for在Visual Studio 2010下崩溃?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14490211/

10-11 22:12