Conversation
yurii-litvinov
left a comment
There was a problem hiding this comment.
Полностью повторяет решение https://github.com/AnNyiiik/HWThirdTerm/pull/3/files#diff-4bad84ce6514350bfacc97c66857ef336944fc356d7a01ebc4f3edb3b6478150. Все списанные домашние работы надо будет полностью с нуля переделать и показывать вживую, умея отвечать на вопросы по решению и вносить правки.
yurii-litvinov
left a comment
There was a problem hiding this comment.
Вот тут Вы пока довольно далеки от правильного решения, хотя определёно движетесь в верном направлении :) Постарайтесь аккуратно самостоятельно разобраться — если получится, любое многопоточное программирование Вам легко дастся.
| readonly int amountOfThreads = 5; | ||
| MyThreadPool threadPool; |
Homework3.Tests/MyTreadPoolTests.cs
Outdated
| @@ -0,0 +1,95 @@ | |||
| | |||
There was a problem hiding this comment.
Тут наверняка будут актуальны многие из замечаний по стайлгайду из задачи про Lazy, их тут тоже надо поправить. Не буду их повторять.
Homework3.Tests/MyTreadPoolTests.cs
Outdated
| var myTask = threadPool.Submit(() => | ||
| { | ||
| throw new InvalidOperationException(); | ||
| return 4; //without this string test doesn't work |
There was a problem hiding this comment.
Тут, скорее всего, проблема с тем, что без return тип лямбды не вывести. Можно добавить явную аннотацию типа: https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/lambda-expressions#explicit-return-type
|
|
||
| Assert.That(values.Count, Is.EqualTo(amountOfThreads)); | ||
| } | ||
| } No newline at end of file |
This comment was marked as resolved.
This comment was marked as resolved.
Sorry, something went wrong.
| @@ -0,0 +1,24 @@ | |||
| using static Homework3.MyThreadPool; | |||
|
|
|||
| public interface IMyTask<T> | |||
This comment was marked as resolved.
This comment was marked as resolved.
Sorry, something went wrong.
Homework3/MyThreadPool.cs
Outdated
| public bool IsCompleted() | ||
| { | ||
| return isResultReady; | ||
| } |
There was a problem hiding this comment.
| public bool IsCompleted() | |
| { | |
| return isResultReady; | |
| } | |
| public bool IsCompleted() | |
| => isResultReady; |
Homework3/MyThreadPool.cs
Outdated
| { | ||
| if (!isResultReady) | ||
| { | ||
| myTaskThreadHandler.Reset(); |
| } | ||
| if (Volatile.Read(ref exception) == null) | ||
| { | ||
| return result; |
This comment was marked as resolved.
This comment was marked as resolved.
Sorry, something went wrong.
Homework3/MyThreadPool.cs
Outdated
| public MyTask(MyThreadPool myThreadPool, Func<T> function) | ||
| { | ||
| this.myThreadPool = myThreadPool; | ||
| this.myThreadPool.taskQueque.Enqueue(new Action(() => |
There was a problem hiding this comment.
Вообще, лучше, чтобы сам объект делал свою работу. Тут на самом деле тредпулу надо много всякой внутренней синхронизации проделать (у Вас пока потребность в этом не возникла, потому что пока что он делает совсем не то, что должен), и MyTask это очень тяжело будет сделать правильно.
Homework3/MyThreadPool.cs
Outdated
| { | ||
| if (!myThreadPool.cancellationTokenSource.IsCancellationRequested) | ||
| { | ||
| var nextFunction = new Func<T2>(() => continueFunction(Result())); |
There was a problem hiding this comment.
Опять-таки, никто не обещал, что в этом месте Shutdown ещё не отработал
| { | ||
| tasks[localI] = threadPool.Submit(() => | ||
| { | ||
| manualResetEvent.WaitOne(); |
There was a problem hiding this comment.
Нам было бы интереснее попробовать Submit делать одновременно, а не задачи, уже поставленные на пул, одновременно стартовать
| { | ||
| Assert.That(tasks[i].Result(), Is.EqualTo(4)); | ||
| } | ||
| } |
There was a problem hiding this comment.
Много потоков, делающих Submit, проверяется, но единственный ли это источник потенциальных гонок в этой задаче?
| /// <typeparam name="T2"></typeparam> | ||
| /// <param name="continueFunction"></param> | ||
| /// <returns></returns> |
| { | ||
| thread.Start(); | ||
| } | ||
|
|
There was a problem hiding this comment.
Перед } пустая строка не ставится
| public class MyThreadPool | ||
| { | ||
| private readonly int timeForEndingWork = 1000; | ||
| private readonly object cancellationTokenLockObject = new(); |
There was a problem hiding this comment.
Странное название, будто этот объект имеет какое-то отношение к cancellationToken именно
|
|
||
|
|
| { | ||
| taskQueue.Enqueue(action); | ||
| threadCanWorkHandler.Set(); | ||
| return; |
| var isSuccessullyRemoved = taskQueue.TryDequeue(out Action? newAction); | ||
| if (isSuccessullyRemoved) | ||
| { | ||
| Interlocked.Add(ref amountOfWorkingThreads, 1); |
| if (!myThreadPool.cancellationTokenSource.IsCancellationRequested) | ||
| { | ||
| var nextFunction = new Func<TContinuationResult>(() => continueFunction(Result())); | ||
| return new MyTask<TContinuationResult>(myThreadPool, nextFunction); |
There was a problem hiding this comment.
Это сразу ставит в пул задачу-continuation, хотя она не может стартовать, пока первая задача не закончится. Получается, что если мы, скажем, поставим в пул задачу на 2 часа, потом 100 continuation-ов к ней на 1 секунду, то один поток из пула будет делать первую задачу, остальные потоки стоять на 165 строчке и не мочь делать другие, готовые к исполнению, задачи. Тут надо хитрее — если задача готова, ставить на пул, иначе складывать во временную очередь, и по готовности добавлять на пул (но подумать, что будет, если пул остановлен).
| return new MyTask<TContinuationResult>(myThreadPool, nextFunction); | ||
| } | ||
| } | ||
| throw new InvalidOperationException("Shutdown was requested, threadpool stoped calculating"); |
There was a problem hiding this comment.
| throw new InvalidOperationException("Shutdown was requested, threadpool stoped calculating"); | |
| throw new InvalidOperationException("Shutdown was requested, threadpool stopped calculating"); |
No description provided.