powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Возникает deadlock в простой обработке, помогите
4 сообщений из 4, страница 1 из 1
Возникает deadlock в простой обработке, помогите
    #38955957
xpoft2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот код:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
[Test]
        public void FewTasks_FewProducers_Success() {
            const int expectedCount = 1000;
            var executed = 0;
            
            var taskMock = new Mock<ITask>();
            taskMock.Setup(t => t.Run()).Callback(() => Interlocked.Increment(ref executed));
            
            var dispatcher = new DefaultTaskDispatcher();
            dispatcher.Start();

            var cts = new CancellationTokenSource();

            var runned = 0;
            var producerAction = new Action(() =>
            {
                while (runned != expectedCount) {
                    try {
                        dispatcher.Dispatch(taskMock.Object);

                        Interlocked.Increment(ref runned);
                    } catch (OverflowException) {
                        Thread.Sleep(1000);
                    }
                }
            });

            var tasks = new List<Task>()
            {
                Task.Run(producerAction, cts.Token)
                ,Task.Run(producerAction, cts.Token)
                //,Task.Run(producerAction, cts.Token)
                //,Task.Run(producerAction, cts.Token)
                //,Task.Run(producerAction, cts.Token)
                //,Task.Run(producerAction, cts.Token)
                //,Task.Run(producerAction, cts.Token)
            };
            Task.WaitAll(tasks.ToArray());
            
#if DEBUG
            var list = dispatcher.StopDebug();
            Assert.AreEqual(0, list.Count);
#endif

            Assert.AreEqual(expectedCount, executed);
        }



По непонятным для меня причинам возникает deadlock (очевидно), связан он однозначно с переменной runned , если запускать только 1 экземпляр задачи, то всё отрабатывает очень быстро, если сделать второй делегат Action и в нём использовать переменную с другим именем, то так же отрабатывает всё отлично, подскажите пожалуйста что это может быть?
...
Рейтинг: 0 / 0
Возникает deadlock в простой обработке, помогите
    #38956283
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xpoft2010,
Попробуй https://msdn.microsoft.com/ru-ru/library/801kt583(v=vs.110).aspx
вместо runned != expectedCount
...
Рейтинг: 0 / 0
Возникает deadlock в простой обработке, помогите
    #38956466
xpoft2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВ,

Думаю это может помочь! Попробую, отпишусь.
...
Рейтинг: 0 / 0
Возникает deadlock в простой обработке, помогите
    #38958080
xpoft2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это был не deadlock как оказалось. До смешного глупую ошибку допустил.

Вот этот код,
Код: c#
1.
while (runned != expectedCount) {


при условии, что проверку прошли одновременно 2 потока приводил к тому, что на следующей итерации 1 или более потоков просто циклились, т.к. в этом случае runned уже был больше expectedCount и условие не выполнялось никогда.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Возникает deadlock в простой обработке, помогите
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]