Войти
ПрограммированиеФорумОбщее

C# : синхронизация потоков переменными типа bool

#0
23:18, 11 июля 2010

Мой лид обожает использовать для синхронизации потоков тип bool вместо чистых объектов взаимоисключения. Разве это хорошо?
Пример про bool, служащий для проверки, надо ли делать ManualResetEvent.WaitOne() уже был.

Еще пример. Есть в шарпе стандартный компонент BackgroundWorker, предназначенный для постоянного выполнения чего-то в отдельном потоке. В нем метод CancelAsync, который взводит поле CancellationPending:
When you call CancelAsync, your worker method has an opportunity to stop its execution and exit. The worker code should periodically check the CancellationPending property to see if it has been set to true.
Его код даже вызывал CancelAsync, правда, не проверял CancellationPending и потому оный вызов был бесполезен. Вместо этого он завел свою булевскую переменную, в которую лазили сразу несколько потоков, заменяющую CancellationPending каждого объекта.

Я вот через предназначенные для этого поля и методы (см. выше) все переделал! Прав ли я?

С другой стороны сравните 2 строчки -
            //while (булевская_переменная)
            while (!(sender as BackgroundWorker).CancellationPending)
Может, второй вариант можно короче?


#1
4:56, 12 июля 2010

>Разве это хорошо?
если volatile bool то терпимо.
>С другой стороны сравните 2 строчки -
> //while (булевская_переменная)
> while (!(sender as BackgroundWorker).CancellationPending)
>Может, второй вариант можно короче?
может и можно короче, только оба варианта уг. есть же RunWorkerCompleted, а пока  что ты что лид говнокод плодите,  уж извини. флашки какието, фубля. мсдн кстати можно почитать, он для доднедовцев на русском даже есть.

#2
12:15, 12 июля 2010

Я тоже за то, чтобы делать по рекомендациям из msdn. Особенно в потоках, ибо они напридумали достаточно шаблонов для многопоточной работы.

#3
14:37, 12 июля 2010

JokerR
> может и можно короче, только оба варианта уг. есть же RunWorkerCompleted

Так а при чем здесь RunWorkerCompleted, это событие вызывается уже когда работа завершена, а вот само завершение этой работы лежит на плечах программиста.
То есть, нужно периодически проверять CancellationPending (что ОП и делает, и тут тоже так делают).

#4
3:56, 15 июля 2010

JokerR
> > азве это хорошо?
> если volatile bool то терпимо.
в многопроцессорных машинах из-за возможности переупорядочивания записей возможны проблемы.

#5
10:21, 15 июля 2010

http://stackoverflow.com/questions/9666/is-accessing-a-variable-i… mic-operation

Потом Раскроюсь
А твой "лид" знает, что ты тут о нем посты делаешь?

#6
12:46, 15 июля 2010

Юзайте AutoResetEvent и ManualResetEvent, и будет вам счастье.

#7
14:27, 15 июля 2010

Потом Раскроюсь
> использовать для синхронизации потоков тип bool вместо чистых объектов взаимоисключения
из разряда "а мужики-то и не знают!" - вот ведь напридумывают всяких левых синхронизаторов, когда нужен всего лишь bool. :)

В многопроцессорной системе необходимо задействовать хардварные механизмы синхронизации, что обеспечивается атомарными операциями, само по себе обращение к памяти операция не атомарная. Там "чудеса" и с нормальными синхронизаторами бывают, а тут bool... :D

#8
5:29, 16 июля 2010

> Мой лид обожает использовать для синхронизации потоков тип bool вместо чистых объектов взаимоисключения. Разве это хорошо?
нет это не хорошо, это даже тупо потому что
1) переменная типа bool не обеспечит синхронизации
2) спин блокировка хавает процессорное время
разве в C# нет симафоров и мьютексов?

ПрограммированиеФорумОбщее

Тема в архиве.