12 / 12 / 1
Регистрация: 05.04.2012
Сообщений: 127
|
||||||
1 | ||||||
Синхронизация потоков: проблема гонки потоков20.10.2014, 03:58. Показов 5367. Ответов 7
Метки нет (Все метки)
Есть проблема в синхронизации потоков, которую я не знаю, как решить. Точнее у меня получается типичная гонка потоков.
Есть функция, которая меняет статический массив. Если два массива (а и б) равны, то поток завершает выполнение. Вот сам код функции: Кликните здесь для просмотра всего текста
В чем казус? Когда один поток находится в лок, а другой в самом начале функции, первый успевает завершить действие (выходит из цикла), а второй в этот момент меняет значение, и получается условие не равно, и все...Как решить данную проблему, кто подскажет?
0
|
20.10.2014, 03:58 | |
Ответы с готовыми решениями:
7
Синхронизация потоков на элементарном уровне (переключение потоков) Синхронизация потоков Синхронизация потоков Синхронизация потоков с# |
20.10.2014, 05:36 | 2 |
MoonGuard, у вас общий (разделяемый между потоками) ресурс это массив, так? Так почему вы тогда блокируете только небольшой участок кода, а не полностью все операции с общим ресурсом внутри потока? Заблокируйте полностью, ну или используйте потокобезопасные коллекции...
1
|
12 / 12 / 1
Регистрация: 05.04.2012
Сообщений: 127
|
|
20.10.2014, 10:22 [ТС] | 3 |
insite2012, хм, просто если я заблокирую всю функцию, т.е. поставлю её в лок. Тогда в чем соль? Потоки будут выполняться по очереди, ну или кто первый захватит, т.е. потеряю всю параллельность.
Соль такая: у меня есть два массива статических. Один поток работает с одним массивом, другой с другим. В тот момент, когда сумма этих массивов равна, работу надо прекращать. Т.е. общий элемент между потоками - это сравнение вот этих массивов. Получается по логике, надо как-то после каждого изменения в массиве, не важно в каком, вызывать эту функцию, при этом останавливая выполнения всех потоков и возможность прерывания их работы. Единственное, что пришло в голову, это тот код что выше, но моя логика либо неправильна, либо неполна, т.к. возникает вот такой казус не разрешенный. Может вы что подскажите?
0
|
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
|
|
20.10.2014, 10:57 | 4 |
MoonGuard, а если так?: каждый поток работает с копией своего массива, вычисляется сумма элементов, общие ресурсы это оригиналы массивов и суммы, лочится процесс сохранения новой суммы и подмены оригинала массива копией. Если после обработки копии старые суммы совпадают то завершаем поток без подмены массива.
1
|
325 / 136 / 28
Регистрация: 18.09.2014
Сообщений: 167
|
||||||
20.10.2014, 11:09 | 5 | |||||
Сообщение было отмечено MoonGuard как решение
Решение
Всё-таки придется вносить операцию изменения элемента массива в lock. Несмотря на то, что массивы разные, операция изменения элемента и последующего сравнения должна быть атомарной, т.е. в момент сравнения не должны происходить модификации массивов другими потоками.
Кроме этого, надо гарантировать, что после достижения равенства ни один из потоков больше не будет модифицировать массивы. Итого вырисовывается след. решение:
1
|
17791 / 12942 / 3381
Регистрация: 17.09.2011
Сообщений: 21,215
|
|
20.10.2014, 11:20 | 7 |
1
|
12 / 12 / 1
Регистрация: 05.04.2012
Сообщений: 127
|
|
20.10.2014, 13:35 [ТС] | 8 |
kolorotur, да вы правы. Я совершенно забыл, что там max-1 значение будет. Просто для повышения вероятности стояло 3 и тесты ошибок не выдавали. После исправил, и забыл про сей важный факт.
Думаю проблему можно считать решенный, всем спасибо
0
|
20.10.2014, 13:35 | |
20.10.2014, 13:35 | |
Помогаю со студенческими работами здесь
8
Синхронизация потоков c# Синхронизация потоков Синхронизация потоков Синхронизация потоков Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |