C++ 线程重复相同的消息,尽管它应该已退出循环
我正在做一个SudokuChecker(如果它是正确的),它有18个线程,每列和每行一个。因此,为了检查每一列/每一行,我用qsort对其排序,然后检查每个位置是否有它应该有的编号。如果没有,它将存储一条错误消息并退出函数(或者应该是这样) 以下是我创建和删除线程的方式: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*
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