|
0 / 0 / 0
Регистрация: 28.01.2009
Сообщений: 21
|
|||||||||||
Синхронизация потоков09.09.2009, 16:50. Показов 4593. Ответов 16
Метки нет (Все метки)
Не пойму своей ошибки в этих двух примерах кода, пожалуйста подскажите.
Синхронизация с помощью мьютексов.
0
|
|||||||||||
| 09.09.2009, 16:50 | |
|
Ответы с готовыми решениями:
16
Синхронизация потоков Синхронизация потоков синхронизация потоков |
|
4 / 4 / 0
Регистрация: 05.09.2009
Сообщений: 11
|
|
| 09.09.2009, 18:06 | |
|
Какая у тебя задача стоит? Какой результат тебе нужен?
Исходя из того что ты привел, то ты пинаешь поочередно 20 потоков, которые начинают наращивать count. После запуска каждого потока ты выводишь текущее значение count, которое изменяется всеми запущенными потоками. Т.е. count ты получаешь такой, каким он успел стать со времени обнуления count до вывода следующего значения count. А потоки ты здесь по всей вероятности не синхронизируешь, а защищаешь данные от совместного использования. В данном случае данные - это экземпляр CountTasks.
0
|
|
|
0 / 0 / 0
Регистрация: 28.01.2009
Сообщений: 21
|
|
| 09.09.2009, 18:18 [ТС] | |
|
Верно, разделение ресурсов. Хотя по сути похоже. Задача такова - нас есть 20 потоков с 50000 итераций в каждом. На выходе должен получиться 1000000. А его не получается. Надо чтобы получался. Ну это чтоб точно знать что разделяем ресурс правильно
0
|
|
|
Администратор
87827 / 53148 / 249
Регистрация: 10.04.2006
Сообщений: 13,761
|
|
| 09.09.2009, 18:20 | |
|
discens, а зачем вы для блокировки используете тот же самый объект? Лучше используйте отдельный объект, например строку, содержащую Guid.
0
|
|
|
0 / 0 / 0
Регистрация: 28.01.2009
Сообщений: 21
|
|
| 09.09.2009, 18:23 [ТС] | |
|
да ну что бы доступа к нему не было. А эт важно?
0
|
|
|
Администратор
87827 / 53148 / 249
Регистрация: 10.04.2006
Сообщений: 13,761
|
||||||
| 09.09.2009, 18:25 | ||||||
Сообщение было отмечено mik-a-el как решение
Решение
Да, важно. Потому что вот так работает:
0
|
||||||
|
0 / 0 / 0
Регистрация: 28.01.2009
Сообщений: 21
|
||||||
| 09.09.2009, 18:26 [ТС] | ||||||
|
а вообще я для увеличения значения, использую эту функцию
то я просто в коде забыл вставить правильно. Но всё равно, правильно не разделяет
0
|
||||||
|
Администратор
87827 / 53148 / 249
Регистрация: 10.04.2006
Сообщений: 13,761
|
|
| 09.09.2009, 18:28 | |
|
Подождите, что-то вы там намудрили, нужно глубже копать...
0
|
|
|
0 / 0 / 0
Регистрация: 28.01.2009
Сообщений: 21
|
|
| 09.09.2009, 18:29 [ТС] | |
|
а вы уверены что у вас работает? потому что у меня нет. Если не тяжело, скажите зачем строку ставить. Я так понимаю надо ставить объект который блокируется?
0
|
|
|
4 / 4 / 0
Регистрация: 05.09.2009
Сообщений: 11
|
|||
| 09.09.2009, 19:03 | |||
|
Смысла в lock ("asfdvsdfvsdvsdvsdsss") {...} нет поскольку каждый раз создается новый string, который и является разделяемым ресурсом. Чтоб синхронизироваться нужно блокировать общий ресурс. Чтоб решить задачу вы должны синхронизировать поток, в котором работает функция Main и остальные потоки. Но какой тогда от этих потоков толк, если нужно блокировать Main до их завершения (по крайней мере для машин с одним процессором )? Добавлено через 15 минут У mik-a-el все "как бы" заработало, потому что собсно никакие ресурсы не разделялись и потоки работали без блокировок, т.е. поживее немного. Поэтому они успевали насчитать 1000000, но не всегда.
1
|
|||
|
0 / 0 / 0
Регистрация: 28.01.2009
Сообщений: 21
|
|
| 09.09.2009, 19:09 [ТС] | |
|
ну, было пару раз что и болье 2000000 насчитало, было что и ровно 1000000. В том то и дело что правильно, а практике не фурычит))).
Ну а что подскажете насчёт мьютексов? там я так понимаю происходит взаимоблокировка процессов, потому что и за 10000 значение не выходит. Хотя с виду вроде бы всё то... Казалось бы такая простая задачка, а тут вот тебе.
0
|
|
|
4 / 4 / 0
Регистрация: 05.09.2009
Сообщений: 11
|
||||||
| 09.09.2009, 19:29 | ||||||
|
Да правильно все у тебя. Потоки работают параллельно. Ты пнул 20 раз ThreadMainWithParameters и они себе и будут работать, а когда ты выводишь Console.WriteLine("Результат цикла {1} = {0}", count.Count,j); то не факт что все они отработали. Может быть и отработали, а скорее всего парочка из них недоработала, поэтому когда ты запускаешь новые 20 потоков то над одним countом не факт что будут работать именно 20 потоков, а вдруг с прошлой 20-ки кто-то не закончил. Поэтому либо запускать циклы последовательно, но тогда смысла в задаче никакой, либо создавать 20 разделяемых ресурсов для каждого потока в отдельности, потом каждый поток блокирует свой ресурс, а ожидать освобождения в main нужно. А если задача такая, что нужно в параллельном потоке чего-нибудь посчитать и вернуть данные в текущий поток, то смотри в сторону ManualResetEvent или мьютексов.
Вот тебе синхронизирующий потоки класс. В одном потоке ты создаешь экземпляр запускаешь поток с вычислениями, а дальше можешь делать че хочешь, только в конце метода вызываешь Wait(), чтоб дождаться результатов работы параллельного патока. А в потоке с вычислениями, после проведения всех операций делаешь UnlockMutex(). Ну а результат можно запихнуть в Data:
1
|
||||||
|
0 / 0 / 0
Регистрация: 28.01.2009
Сообщений: 21
|
|
| 09.09.2009, 19:36 [ТС] | |
|
Спасибо Андрей, а в том коде где я с мьютексами работал, ты на первый взгляд ошибку нигде не видишь?
0
|
|
|
4 / 4 / 0
Регистрация: 05.09.2009
Сообщений: 11
|
|
| 09.09.2009, 19:51 | |
|
вроде все нормально.
0
|
|
|
0 / 0 / 0
Регистрация: 28.01.2009
Сообщений: 21
|
||||||
| 09.09.2009, 20:32 [ТС] | ||||||
|
Насчёт того что потоки может не успевают, ты может и прав вот что вышло когда писалось на WinApi C++
0
|
||||||
|
4 / 4 / 0
Регистрация: 05.09.2009
Сообщений: 11
|
|||||||
| 10.09.2009, 11:35 | |||||||
|
Там ведь ты вызываешь вот это: WaitForMultipleObjects(20,hThreadInfo,tr ue,-1); в main. Попробуй printf сделать до этого вызова.
Добавлено через 13 минут Добавлено через 1 час 20 минут В общем вот тоже самое что и на С++ только на C#. Если ты закоментишь в этом коде WaitForMultipleObjects(20, Handlers, true, -1);, то получишь примерно туже чушь что и в первом твоем примере.
1
|
|||||||
|
0 / 0 / 0
Регистрация: 28.01.2009
Сообщений: 21
|
|
| 16.09.2009, 09:17 [ТС] | |
|
книжка называется - C# 2005 и платформа .NET 3.0 для профессионалов (Кристиан Нейгел и др.)
0
|
|
| 16.09.2009, 09:17 | |
|
Помогаю со студенческими работами здесь
17
Синхронизация потоков Синхронизация потоков, мьютекс Синхронизация групп потоков Асинхронный сокет синхронизация потоков Синхронизация потоков в бесконечном цикле Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам
Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/
O1rJuneU_ls
https:/ / vkvideo. ru/ video-115721503_456239114
|