powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Потокобезопасное использование потоконебезопасных коллекций
25 сообщений из 145, страница 5 из 6
Потокобезопасное использование потоконебезопасных коллекций
    #38758962
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВЯ тебе про то, что есть список задач и нельзя выполнить задачу N+1 не зная результата для N и так для всего списка.
Ну если у тебя весь стек задач так устроен, то да. А если 1 задача из 100 задач не зависит ни от чего, то почему бы её не распаралелить?

ЕвгенийВДешевый пиар ресурса. Какой ресурс, такой и пиар :)
Дешевый вброс бреда от ЕвгенийВ. Ничего ресурс винить из-за собственного криворучия :)

ЕвгенийВТы путаешь Божий дар с яичницей! Запустить алгоритм в отдельном потоке - не значит распараллелить его.
Собственно, и наоборот, распараллелить - это не значит использовать отдельный поток. Может быть задействован как и поток из пула, так и асинхронный вызов. Но мы не о том. Какая тебе разница, выполнится ли блок асинхронно или в отдельном треде? Отдай эту работу отдельным механизмам фреймворка. И ты получишь результат.

ЕвгенийВИли там генератор всех возможных программ на C#.
А в чем проблема? [/quot]
Я например не могу, просвети, покажи код?[/quot]
Причем тут могу или не могу? Обрисуй задачу, опиши проблемы. А потом обсудим решение.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758965
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Четыре:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
using System;
using System.Collections.Generic;
using System.Threading;

namespace QueueApplication
{
    class Program
    {
        static void Main()
        {
            Queue<int> queue = new Queue<int>();

            new Thread(() =>
            {
                Thread.Sleep(1000);

                lock (queue)
                {
                    queue.Enqueue(1);
                }

                Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Added element to queue.");
                
                Thread.Sleep(1000);

                Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": One second later ...");

            }).Start();

            Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Waiting for size change...");

            while (true)
            {
                lock (queue)
                {
                    if (queue.Count > 0)
                    {
                        Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Noticed size change.");

                        break;
                    }
                }
            }

            Console.ReadKey();
        }
    }
}
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758975
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA ,
И в чем суть? Вы проверку размера внесли внутрь лока, разумеется все работает в таком случае.
Мы говорим про вот этот код:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
while (true)
{
    if (queue.Count > 0)
    {
        Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Noticed size change.");

        break;
    }
}

Опять написали, не подумав?
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758977
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA ,
Вторая ошибка - вы компилируете по x86. У меня мой код под эту платформу тоже работает. А под x64 нет.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758991
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
codearticles.ruНу если у тебя весь стек задач так устроен, то да.
У Эрика да.

codearticles.ruСобственно, и наоборот, распараллелить - это не значит использовать отдельный поток. Может быть задействован как и поток из пула, так и асинхронный вызов. Но мы не о том. Какая тебе разница, выполнится ли блок асинхронно или в отдельном треде? Отдай эту работу отдельным механизмам фреймворка. И ты получишь результат.
Еще раз повторяю, напиши алгоритм получения чисел Фибоначи, который при своем вычислении будет использовать все ядра процессора.

ЕвгенийВПричем тут могу или не могу? Обрисуй задачу, опиши проблемы. А потом обсудим решение.
Напиши метод с сигнатурой IEnumerable<string> GetAllProgramms(), который вернет список ВСЕХ возможных программ на C#, в том числе которые были приведены в этом обсуждении, в этом форуме, которые написал ты, которые написали все, кого ты знаешь и т. д. :)
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759005
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВcodearticles.ruНу если у тебя весь стек задач так устроен, то да.
У Эрика да.
Откуда знаешь?

ЕвгенийВЕще раз повторяю, напиши алгоритм получения чисел Фибоначи, который при своем вычислении будет использовать все ядра процессора.
Ты прямо жжешь с каждым постом.

Сначало было:

ЕвгенийВНапиши например "банальный многопоточный" генератор чисел Фиббоначи.

Дал код на джаве. Теперь ты вбрасываешь:

ЕвгенийВнапиши алгоритм получения чисел Фибоначи, который при своем вычислении будет использовать все ядра процессора.

А потом будет: напиши алгоритм получения чисел Фибоначи, который при своем вычислении будет использовать свечения луны и силу маха крыльев всех бабочек Земли. Так?

Причем тут процессор? Откуда он взялся? Речь была о малтитрединге и в частности о распараллеливании. Выйди из сумрака.

ЕвгенийВПричем тут могу или не могу? Обрисуй задачу, опиши проблемы. А потом обсудим решение.
Напиши метод с сигнатурой IEnumerable<string> GetAllProgramms(), который вернет список ВСЕХ возможных программ на C#, в том числе которые были приведены в этом обсуждении, в этом форуме, которые написал ты, которые написали все, кого ты знаешь и т. д. :)[/quot]
Ты бредишь? Я вижу, что да.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759008
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Свеном, причем здесь твой код с локальной переменной? Твоя хваленая волатильность работает для полей, а не переменных: Ключевое слово volatile можно применить только к полям класса или структуры. Локальные переменные не могут быть объявлены как volatile (цитата из MSDN)

Так что все у skyANA правильно, через lock.

Что имеется ввиду под статическим враппером - не знаю, но все работает не только для static полей, но и для остальных тоже.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759026
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Свеном, причем здесь твой код с локальной переменной? Твоя хваленая волатильность работает для полей, а не переменных: Ключевое слово volatile можно применить только к полям класса или структуры. Локальные переменные не могут быть объявлены как volatile (цитата из MSDN)Вы уже окончательно запутались. Вы читаете неволатильное поле Queue.count - в этом ваша ошибка. Так как оно неволатильно, ваш код и не работает.

Arm79Так что все у skyANA правильно, через lock.Вот именно, что у него все правильно написано, потмоу и работает. А у вас нет, потому код не работает.

Arm79Что имеется ввиду под статическим враппером - не знаю, но все работает не только для static полей, но и для остальных тоже.У вас работает. А на других окружениях нет.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759051
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да уж, алгоритмическая подготовка - хуже чем плохо :(
codearticles.ruДа что ты говоришь http://codearticles.ru/articles/2492

Кстати, этот код еще подойдет для начального ознакомления с тасками, чего впрочем хватает для того, что бы в простейшем случае отделить рабочий поток от гуя, рисованием которого автор видимо и занимается большую часть времени. Но каждый здравомыслящий программист видит, что если независимых групп, на которые можно разделить имеющиеся задачи превышает количество ядер процессора, то за такое распараллеливание надо молотком по пальцам!

codearticles.ruТы бредишь? Я вижу, что да.
С твоей колокольни - да. С колокольни пишущих компиляторы - нет.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759052
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvArm79Свеном, причем здесь твой код с локальной переменной? Твоя хваленая волатильность работает для полей, а не переменных: Ключевое слово volatile можно применить только к полям класса или структуры. Локальные переменные не могут быть объявлены как volatile (цитата из MSDN)Вы уже окончательно запутались. Вы читаете неволатильное поле Queue.count - в этом ваша ошибка. Так как оно неволатильно, ваш код и не работает.

Arm79Так что все у skyANA правильно, через lock.Вот именно, что у него все правильно написано, потмоу и работает. А у вас нет, потому код не работает.

Arm79Что имеется ввиду под статическим враппером - не знаю, но все работает не только для static полей, но и для остальных тоже.У вас работает. А на других окружениях нет.

Я не понял? :-) Еще раз, если очередь - это поле, неважно, статическое или нет, с ним все прекрасно работает. Собственно, код, который я привел, это иллюстрирует.

Если вы объявляете локальную переменную и с ней занимаетесь ерундой типа замыканий, у вас проблемы.

Далее, вы же говорили, что нужно использовать волатильность? Но почему примеры у вас без неё? Может, потому что локальные переменные и volatile несовместимы?
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759071
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВДа уж, алгоритмическая подготовка - хуже чем плохо :(
Не говори. Формулирование требований и внятность изъяснения - в уверенном минусе.

ЕвгенийВКстати, этот код еще подойдет для начального ознакомления с тасками, чего впрочем хватает для того, что бы в простейшем случае отделить рабочий поток от гуя, рисованием которого автор видимо и занимается большую часть времени.
А почему ты считаешь, что отделение рабочего потока от гуя - детская задача? Вот, выше твой афтар даже пишет, что и такого пороха не нюхал. А ты его тут иконой ставишь. Так что не рассказывай мне про детский сад, загляни к себе в карман и найдешь кучу погремушек и даже соску.

ЕвгенийВНо каждый здравомыслящий программист видит, что если независимых групп, на которые можно разделить имеющиеся задачи превышает количество ядер процессора, то за такое распараллеливание надо молотком по пальцам!
Садись, двойка. Количество процессоров тут второстепенно, важнее, сколько потоков на процесс я могу заполучить. Готов тебя разочаровать, 32-битный процесс с дефолтным адресным пространством может создать максимум 2048 потоков. А теперь рассказать про лимиты x64? Если у тебя несколько десятков, а то и сотен, "блоков" - смело параллель их и ни о чем не думай. Твои познания в этой области ниже плинтуса.

ЕвгенийВС твоей колокольни - да. С колокольни пишущих компиляторы - нет.
Выдыхай.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759111
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
codearticles.ruСадись, двойка. Количество процессоров тут второстепенно, важнее, сколько потоков на процесс я могу заполучить. Готов тебя разочаровать, 32-битный процесс с дефолтным адресным пространством может создать максимум 2048 потоков. А теперь рассказать про лимиты x64? Если у тебя несколько десятков, а то и сотен, "блоков" - смело параллель их и ни о чем не думай. Твои познания в этой области ниже плинтуса.


Запусти у себя хоть столько.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 var pc = Environment.ProcessorCount * 4 + 1;
            Action[] acts = new Action[pc];
            for (int i = 0; i < pc; i++)
            {
                acts[i] = () => 
                {
                    while (true)
                    {
                        Random r = new Random();
                        var d = Math.Sin(r.NextDouble());
                        if (d == 0.0)
                            break;
                    }
                };
            }
            Parallel.Invoke(acts);


Отпишешься, после перезагрузки "резетом".
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759113
zz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
codearticles.ruЕсли у тебя несколько десятков, а то и сотен, "блоков" - смело параллель их и ни о чем не думай.
А объясните пожалуйста, в чем смысл такого параллеливания, все равно ведь не удастся повысить производительность больше, чем количество ядер процессора? Или я ошибаюсь?
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759125
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zzА объясните пожалуйста, в чем смысл такого параллеливания, все равно ведь не удастся повысить производительность больше, чем количество ядер процессора? Или я ошибаюсь?
Если выполняются ресурсоёмкие вычисления, то получим сильную конкуренцию между потоками, большие затраты на переключение контекста и как следствие результаты худшие, чем при последовательной обработке.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759132
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВЗапусти у себя хоть столько.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 var pc = Environment.ProcessorCount * 4 + 1;
            Action[] acts = new Action[pc];
            for (int i = 0; i < pc; i++)
            {
                acts[i] = () => 
                {
                    while (true)
                    {
                        Random r = new Random();
                        var d = Math.Sin(r.NextDouble());
                        if (d == 0.0)
                            break;
                    }
                };
            }
            Parallel.Invoke(acts);


Отпишешься, после перезагрузки "резетом".

Запусти это. Отпишись, как получишь количество разных тредов, большее, чем число процессоров

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
class Program
{
    static void Main(string[] args)
    {
        var list = new ConcurrentBag<int>();
        var tasks = Enumerable.Range(1, 1000).Select(d => FooAsync(list)).ToArray();
        Task.WaitAll(tasks);

        foreach (var threadId in list.Distinct())
        {
            Console.WriteLine(threadId);
        }

        Console.Read();
    }

    async static Task FooAsync(ConcurrentBag<int> list)
    {
        await Task.Yield();
        list.Add(Thread.CurrentThread.ManagedThreadId);
    }
}
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759135
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zzcodearticles.ruЕсли у тебя несколько десятков, а то и сотен, "блоков" - смело параллель их и ни о чем не думай.
А объясните пожалуйста, в чем смысл такого параллеливания, все равно ведь не удастся повысить производительность больше, чем количество ядер процессора? Или я ошибаюсь?
Это исключительный случай, когда распараллеливание ничем не поможет. Должна быть хоть одна задача, которая не зависит от предыдущих. Тогда имеет смысл параллелить.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759139
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjv skyANA ,
Вторая ошибка - вы компилируете по x86. У меня мой код под эту платформу тоже работает. А под x64 нет.Скриншот внимательно смотри.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759146
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВ, и да, объяснять разницу, между логическими и физическими процессорами?
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759151
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это так, к слову.

Код: c#
1.
2.
3.
var item = new ManagementObjectSearcher("Select * from Win32_ComputerSystem").Get().OfType<ManagementObject>().First();
var a = item.Properties["NumberOfProcessors"].Value;
var b = item.Properties["NumberOfLogicalProcessors"].Value;
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759179
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
codearticles.ru
Запусти это. Отпишись, как получишь количество разных тредов, большее, чем число процессоров

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
class Program
{
    static void Main(string[] args)
    {
        var list = new ConcurrentBag<int>();
        var tasks = Enumerable.Range(1, 1000).Select(d => FooAsync(list)).ToArray();
        Task.WaitAll(tasks);

        foreach (var threadId in list.Distinct())
        {
            Console.WriteLine(threadId);
        }

        Console.Read();
    }

    async static Task FooAsync(ConcurrentBag<int> list)
    {
        await Task.Yield();
        list.Add(Thread.CurrentThread.ManagedThreadId);
    }
}


Так ты делай какую нибудь полезную работенку? Хоть например дергай главного пользователя своего сайта из базенки по ID?
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759187
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВТак ты делай какую нибудь полезную работенку? Хоть например дергай главного пользователя своего сайта из базенки по ID?
Да какая разница, напиши вместо Task.Yield тот же Task.Delay(10). И еще, когда последний раз букварь читал про ParallelOptions.MaxDegreeOfParallelism? Перечитай его еще разок.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759201
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё дело в дефолтной установке ThreadPool.GetMinThreads, а не в количестве процессоров Тебя снова подвела безграмотность.

P.S. Тем более нужно сразу говорить, что речь о логических процессорах. Чтобы не вводить никого в заблуждение.

Итак, вернемся к нашим баранам :)

Вот тут ты ляпнул глупость:

ЕвгенийВНо каждый здравомыслящий программист видит, что если независимых групп, на которые можно разделить имеющиеся задачи превышает количество ядер процессора, то за такое распараллеливание надо молотком по пальцам!

Теперь ты согласен, что "надо молотком по пальцам" тебя, а не кого-то там другого? Имей честно признать, что ты слил. Честно признайся в некомпетентности и я отпущу тебя с миром. Покайся.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759243
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
codearticles.ru,
Делай что нибудь полезное, а не жди.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759275
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjv skyANA ,
Вторая ошибка - вы компилируете по x86. У меня мой код под эту платформу тоже работает. А под x64 нет.
Мне просто интересно, на каких процессорах ты тестируеш?
Тероретически на Итаниумах таки да, запись/увеличение счётчика не синхонизирует кеш лайнс. На Х86 кеши всегда когерентны. но вроде не всегда на АМД64. У них более слабая модель памяти чем Х86 но более строгая чем на итаниумах. Что за железо?
А то выяснится, что как ты не показывай проблему, у всех интелы :)
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759314
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Я не понял? :-) Еще раз, если очередь - это поле, неважно, статическое или нет, с ним все прекрасно работает. Собственно, код, который я привел, это иллюстрирует.
Если вы объявляете локальную переменную и с ней занимаетесь ерундой типа замыканий, у вас проблемы. Вот этот код не работает, хоть очередь и "поле":
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
//private static Queue<int> queue = new Queue<int>();
private Queue<int> queue = new Queue<int>();

static void Main(string[] args)
{
    Program prog = new Program();

    prog.Hang();
}

private void Hang()
{
    new Thread(() =>
    {
        Thread.Sleep(1000);

        lock (queue)
        {
            queue.Enqueue(1);
        }

        Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Added element to queue.");

        Thread.Sleep(1000);

        Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": One second later ...");
    }).Start();

    Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Waiting for size change...");

    while (true)
    {
        if (queue.Count > 0)
        {
            Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Noticed size change.");

            break;
        }
    }
}


Если же сделать поле статическим, то код начинает работать. Это нормально, по-вашему, писать такой код, который работает или не работает по непонятным причинам?

Arm79Далее, вы же говорили, что нужно использовать волатильность? Но почему примеры у вас без неё? Может, потому что локальные переменные и volatile несовместимы?Потому что мои примеры не демонстрируют корректное решение. Они демонстрируют некорреткность вашего решения.
...
Рейтинг: 0 / 0
25 сообщений из 145, страница 5 из 6
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Потокобезопасное использование потоконебезопасных коллекций
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]