private void WriteData(ThreadMultiplyResult result) { for (int i = 0; i != result.Data.Length; i++) _LogStream.Write("{0} ", result.Data[i]); _LogStream.Flush(); _NextColumnIndex += result.Data.Length; if (_NextColumnIndex >= _MaxLength) { _NextColumnIndex = 0; ++_NextLineIndex; _LogStream.WriteLine(); } }
public void ConcurrentWrite(ThreadMultiplyResult result) { lock (_LogStream) { if (_NextLineIndex == result.LineIndex && _NextColumnIndex == result.ColumnIndex) { WriteData(result); ThreadMultiplyResult NextResult = null; while ((NextResult = _PrintingQueue.FirstOrDefault(x => x.LineIndex == _NextLineIndex && x.ColumnIndex == _NextColumnIndex)) != null) { WriteData(NextResult); _PrintingQueue.Remove(NextResult); } } else { _PrintingQueue.Add(result); } } }
private ThreadMultiplyResult ThreadMultiply(object state) { ThreadData threadData = state as ThreadData; ThreadMultiplyResult result = new ThreadMultiplyResult(new long[threadData.Count], threadData.LineIndex, threadData.ColumnStartIndex); int calculateBlock = threadData.LeftArray.Length; for (long currentBlock = 0; currentBlock < MatrixLeftCollsCount; ) { LeftMatrix.FillLine(threadData.LeftArray, threadData.LineIndex, currentBlock, calculateBlock); RightMatrix.FillMatrix(threadData.RightArray, threadData.ColumnStartIndex, currentBlock, calculateBlock); for (int i = 0; i != result.Data.Length; ++i) for (int j = 0; j != calculateBlock; ++j) result.Data[i] += threadData.LeftArray[j] * threadData.RightArray[i][j]; currentBlock += calculateBlock; if (MatrixLeftCollsCount - currentBlock < _MaxAlloc) calculateBlock = (int)(MatrixLeftCollsCount - currentBlock); } _ObjectPool.ReleaseObject(threadData); return result; }