コード例 #1
0
        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();
            }
        }
コード例 #2
0
 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;
		}