12 / 12 / 1
Регистрация: 05.04.2012
Сообщений: 127
|
||||||
Синхронизация потоков: проблема гонки потоков20.10.2014, 03:58. Показов 5525. Ответов 7
Метки нет Все метки)
(
Есть проблема в синхронизации потоков, которую я не знаю, как решить. Точнее у меня получается типичная гонка потоков.
Есть функция, которая меняет статический массив. Если два массива (а и б) равны, то поток завершает выполнение. Вот сам код функции: Кликните здесь для просмотра всего текста
В чем казус? Когда один поток находится в лок, а другой в самом начале функции, первый успевает завершить действие (выходит из цикла), а второй в этот момент меняет значение, и получается условие не равно, и все...Как решить данную проблему, кто подскажет?
0
|
20.10.2014, 03:58 | |
Ответы с готовыми решениями:
7
Синхронизация потоков на элементарном уровне (переключение потоков) Синхронизация потоков Синхронизация потоков |
![]() ![]() |
||
20.10.2014, 05:36 | ||
1
|
12 / 12 / 1
Регистрация: 05.04.2012
Сообщений: 127
|
|
20.10.2014, 10:22 [ТС] | |
insite2012, хм, просто если я заблокирую всю функцию, т.е. поставлю её в лок. Тогда в чем соль? Потоки будут выполняться по очереди, ну или кто первый захватит, т.е. потеряю всю параллельность.
Соль такая: у меня есть два массива статических. Один поток работает с одним массивом, другой с другим. В тот момент, когда сумма этих массивов равна, работу надо прекращать. Т.е. общий элемент между потоками - это сравнение вот этих массивов. Получается по логике, надо как-то после каждого изменения в массиве, не важно в каком, вызывать эту функцию, при этом останавливая выполнения всех потоков и возможность прерывания их работы. Единственное, что пришло в голову, это тот код что выше, но моя логика либо неправильна, либо неполна, т.к. возникает вот такой казус не разрешенный. Может вы что подскажите?
0
|
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
|
|
20.10.2014, 10:57 | |
MoonGuard, а если так?: каждый поток работает с копией своего массива, вычисляется сумма элементов, общие ресурсы это оригиналы массивов и суммы, лочится процесс сохранения новой суммы и подмены оригинала массива копией. Если после обработки копии старые суммы совпадают то завершаем поток без подмены массива.
1
|
![]() 325 / 136 / 28
Регистрация: 18.09.2014
Сообщений: 167
|
||||||
20.10.2014, 11:09 | ||||||
![]() Решение
Всё-таки придется вносить операцию изменения элемента массива в lock. Несмотря на то, что массивы разные, операция изменения элемента и последующего сравнения должна быть атомарной, т.е. в момент сравнения не должны происходить модификации массивов другими потоками.
Кроме этого, надо гарантировать, что после достижения равенства ни один из потоков больше не будет модифицировать массивы. Итого вырисовывается след. решение:
1
|
![]() ![]() |
||
20.10.2014, 11:15 | ||
1
|
12 / 12 / 1
Регистрация: 05.04.2012
Сообщений: 127
|
|
20.10.2014, 13:35 [ТС] | |
kolorotur, да вы правы. Я совершенно забыл, что там max-1 значение будет. Просто для повышения вероятности стояло 3 и тесты ошибок не выдавали. После исправил, и забыл про сей важный факт.
Думаю проблему можно считать решенный, всем спасибо ![]()
0
|
20.10.2014, 13:35 | |
Помогаю со студенческими работами здесь
8
Синхронизация потоков с# Синхронизация потоков c# Синхронизация потоков
Синхронизация потоков Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
![]() |
||||
Создание нейросети с PyTorch
AI_Generated 19.06.2025
Ключевое преимущество PyTorch — его питоновская натура. В отличие от TensorFlow, который изначально был построен как статический вычислительный граф, PyTorch предлагает динамический подход. Это. . .
|
JWT аутентификация в ASP.NET Core
UnmanagedCoder 18.06.2025
Разрабатывая веб-приложения, я постоянно сталкиваюсь с дилеммой: как обеспечить надежную аутентификацию пользователей без ущерба для производительности и масштабируемости? Классические подходы на. . .
|
Краткий курс по С#
aaLeXAA 18.06.2025
Здесь вы найдете все необходимые функции чтоб написать програму на C#
Задание 1:
КЛАСС FORM 1
public partial class Form1 : Form
{
Spisok listin = new Spisok();
. . .
|
50 самых полезных примеров кода Python для частых задач
py-thonny 17.06.2025
Эффективность работы разработчика часто измеряется не количеством написаных строк, а скоростью решения задач. Готовые сниппеты значительно ускоряют разработку, помогают избежать типичных ошибок и. . .
|
C# и продвинутые приемы работы с БД
stackOverflow 17.06.2025
Каждый . NET разработчик рано или поздно сталкивается с ситуацией, когда привычные методы работы с базами данных превращаются в источник бессонных ночей. Я сам неоднократно попадал в такие ситуации,. . .
|
Angular: Вопросы и ответы на собеседовании
Reangularity 15.06.2025
Готовишься к техническому интервью по Angular? Я собрал самые распространенные вопросы, с которыми сталкиваются разработчики на собеседованиях в этом году. От базовых концепций до продвинутых. . .
|
Архитектура Onion в ASP.NET Core MVC
stackOverflow 15.06.2025
Что такое эта "луковая" архитектура? Термин предложил Джеффри Палермо (Jeffrey Palermo) в 2008 году, и с тех пор подход только набирал обороты. Суть проста - представьте себе лук с его. . .
|
Unity 4D
GameUnited 13.06.2025
Четырехмерное пространство. . . Звучит как что-то из научной фантастики, правда? Однако для меня, как разработчика со стажем в игровой индустрии, четвертое измерение давно перестало быть абстракцией из. . .
|
SSE (Server-Sent Events) в ASP.NET Core и .NET 10
UnmanagedCoder 13.06.2025
Кажется, Microsoft снова подкинула нам интересную фичу в новой версии фреймворка. Работая с превью . NET 10, я наткнулся на нативную поддержку Server-Sent Events (SSE) в ASP. NET Core Minimal APIs. Эта. . .
|
С днём независимости России!
Hrethgir 13.06.2025
Решил побеседовать, с утра праздничного дня, с LM о завоеваниях. То что она написала о народе, представителем которого я являюсь сам сначала возмутило меня, но дальше только смешило. Это чисто. . .
|