Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 线程重复相同的消息,尽管它应该已退出循环_C++_Multithreading_Unix_Mutex - Fatal编程技术网

C++ 线程重复相同的消息,尽管它应该已退出循环

C++ 线程重复相同的消息,尽管它应该已退出循环,c++,multithreading,unix,mutex,C++,Multithreading,Unix,Mutex,我正在做一个SudokuChecker(如果它是正确的),它有18个线程,每列和每行一个。因此,为了检查每一列/每一行,我用qsort对其排序,然后检查每个位置是否有它应该有的编号。如果没有,它将存储一条错误消息并退出函数(或者应该是这样) 以下是我创建和删除线程的方式: vector <thread*> threads; for (int i = 0; i < 9; ++i) { cout << i << endl; thread*

我正在做一个SudokuChecker(如果它是正确的),它有18个线程,每列和每行一个。因此,为了检查每一列/每一行,我用qsort对其排序,然后检查每个位置是否有它应该有的编号。如果没有,它将存储一条错误消息并退出函数(或者应该是这样)

以下是我创建和删除线程的方式:

vector <thread*> threads;

for (int i = 0; i < 9; ++i)
{
    cout << i << endl;
    thread* rowThread = new thread (&SudokuChecker::checkRow, this, i);
    thread* columnThread = new thread (&SudokuChecker::checkColumn, this, i);
    threads.push_back (rowThread);
    threads.push_back (columnThread);
}

for (thread* t : threads) t->join ();
for (thread* t : threads) delete t;
对数约为180,最大值应为18。我的第一个猜测是,如果存储每个数字错误,则意味着9个错误x 18列/行,即162;但有171个错误


如何解决这个问题?

启动、停止和同步所有这些微小线程的开销淹没了任何可以想象的收益。一次调用一个函数就行了。是的,我猜是这样,但这是为了大学,所以我只能做itOkay。不要学太多坏习惯
只需使用int作为位掩码,每次设置适当的位,然后将结果与0x1ff进行比较,就可以省去复制数组和排序的所有麻烦(这也会给每个线程带来一个错误,不过也可以使用break语句实现)。如果您必须排序,我不确定qsort对于如此小的数组是否值得,也许这里更简单的东西更好,不确定。另外,我认为您在循环中缺少了一个索引(应该是I<9吗?)“entered row N”在您的输出中出现了多少次?
bool SudokuChecker::checkRow (int row)
{
    if ((row < 0) || (row > 8))
    {
        cout << "Error in row parameter" << endl;
        return true;
    }

    int checkingArray [9];
    for (int i = 0; i < 9; ++i) checkingArray [i] = mSudoku [row][i];

    qsort (checkingArray, 9, sizeof (int), compare);

    for (int i = 0; i < 8; ++i)
    {
        if (checkingArray [i] != i + 1)
        {
            std::stringstream error;
            error << "File ";
            error << mFileName;
            error << ": Error in row - ";
            cout << "entered row" << row << endl;
            error << row;
            error << '\n';

            while(!mMutex.try_lock());
            mErrorLog.push_back(error.str());
            mMutex.unlock();

            return true;
        }
    }   

    return false;
}
File Grid01.sdk: Error in column - 1
File Grid01.sdk: Error in column - 1
File Grid01.sdk: Error in row - 1
File Grid01.sdk: Error in column - 1
File Grid01.sdk: Error in row - 1
File Grid01.sdk: Error in column - 0
File Grid01.sdk: Error in column - 1
File Grid01.sdk: Error in row - 1
File Grid01.sdk: Error in column - 0
File Grid01.sdk: Error in row - 2
File Grid01.sdk: Error in column - 1
File Grid01.sdk: Error in row - 1
File Grid01.sdk: Error in column - 0
File Grid01.sdk: Error in row - 2
File Grid01.sdk: Error in row - 0
File Grid01.sdk: Error in column - 1
File Grid01.sdk: Error in row - 1
File Grid01.sdk: Error in column - 0
File Grid01.sdk: Error in row - 2
File Grid01.sdk: Error in row - 0