| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Потоки, с общим ресурсом |
| Автор: AGENTxXx 31.10.2011, 21:44 |
| Добрый вечер друзья! Вот такая вот проблема: Есть 2 потока. У каждого из них есть свой ресурс - число. После того как они создались, они должны сравнить свое число с общим числом(ресурсом). И после этого в общий ресурс записывается наименьшее число и далее идет условие: если число у потока<=общему ресурсу (числу) то разрешить завершение его первым, а 2ой поток завершиться позже. Наглядный пример задачи: 2 человека взяли в терминале карточки с номером 1 и 2, чтобы стоять в определенной очереди и оба подошли к кассе. Кассир посмотрел у себя по компу, что к нему зарегались 1 и 2. Но так как 1 это сделал раньше - то и обслужить его нужно в первую очередь. А в задаче вижу проблему в том, что: нужно как то по очереди проверить в начале число у первого потока, потом у второго, потом завершить поток с меньшим числом, а далее с большим. Можете просто помочь в словесной форме, если это для вас проще) P.S.: нужно реализовать обязательно с разными потоками. Как сделать все в одном потоке - это я и сам знаю) всем ОГРОМНОЕ спасибо заранее! |
| Автор: AGENTxXx 4.11.2011, 22:30 |
| На счет последнего вопроса: если кто, то раньше своей очереди подошел, то тот все равно должен ждать, когда перед ним все пройдут. Вот хороший пример про банк например: человек пошел в банк и снял деньги, потом он решил пойти в магазин и приобрести продукты и оплатить картой, но так как предыдущая транзакция в баке еще могла быть не обработана, то оплата в магазине может произойти только после того, как транзакция о снятии денег пройдет. В данном случае у каждого действия есть свой номер, и получается что снятие денек в банке, это 1, а оплата в магазине - это 2. Следовательно, если 1 еще не обработан, то 2му там еще и делать не че. А чтобы это учесть, у нас есть как раз общий ресурс, который говорит, до какого номера можно выполнять транзакцию. Надеюсь стало чуть по яснее! |
| Автор: Дрон 5.11.2011, 16:18 | ||||
Значит моё предположение было верным: ты хочешь, чтобы в какой-то момент потоки подождали друг друга и выполнились в определённом порядке. Придумал я решение и не очень-то сложное, как оказалось Хотя может можно было и проще Прикрепил к этому сообщению. Писал в Visual Studio 2010, но там только в одном месте используется LinQ, а так в целом и под .NET 2.0 можно запустить заменив эту строчку. На словах идея такая: для того, чтобы потоки выполняли какой-то код по очереди можно использовать Mutex (можно и что-то другое, но у Mutex есть несколько полезных свойств). Проблема в том, что Mutex просто разрешает выполняться первому пришедшему потоку, а нам нужен определённый порядок. Поэтому прежде чем использовать Mutex надо проверить, а действительно ли текущий поток -- самый приоритетный. Если нет, то поток ставится на паузу и ожидает каких-либо изменений в очереди. Написано в достаточно общем виде с учётом возможности непредвиденного завершения потоков или случая больше двух потоков. Вот основной код, без комментариев, если вдруг кому-то интересно, а качать архив не хочется
|