使用c ++ 11 std :: thread获取segfault

时间:2014-01-23 20:47:12

标签: c++ multithreading c++11 segmentation-fault stdthread

static T MultiplyElement(const Matrix& matrixA, const Matrix& matrixB, 
    unsigned M2col, unsigned M1row)
{
    T sumToReturn = 0;

    for (unsigned iM1colM2row = 0; iM1colM2row < matrixA.m_n; iM1colM2row++)
    {
        sumToReturn += 
            matrixA.m_data[M1row][iM1colM2row] * matrixB.m_data[iM1colM2row][M2col];
    }

    return sumToReturn;
}

...

    std::vector<std::thread> threads;
    for(unsigned i = 0; i < outM ; ++i)
    {
        for(unsigned j = 0; j < outN; ++j)
        {
            threads.push_back(std::thread([&]()
            {
                outMatrix.m_data[i][j] = MultiplyElement(matrixA, matrixB, i, j);
            }
            ));
        }
    }
    for(auto& thread : threads)
    {
        thread.join();
    }

编译: clang ++ -std = c ++ 11 -stdlib = libc ++ newFile.cpp

我在MultiplyElement中遇到了一个段错误...任何想法为什么?

1 个答案:

答案 0 :(得分:2)

我认为问题出在你的捕获上。您正在对所有变量使用reference-capture。您应该按值捕获ij。请尝试[&, i, j]获取捕获子句。

修改:您可以查看answer here。你有同样的问题。