Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
 Аватар для Slicker
49 / 49 / 12
Регистрация: 18.01.2013
Сообщений: 169

Переменные в потоках оказываются с одинаковыми значениями

07.08.2014, 09:16. Показов 2252. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Возникла некоторая проблема, которую я что-то сомневаюсь как решать.
В общем есть на работе древняя программка, она читает некоторые конфиги и делает что-либо.
Раньше программка была не так сильно нагружена и просто по порядку читала конфиги и выполняла нужное действие. Сейчас же конфигов стало так много, что нужно стало выполнять их параллельно.
Но вот незадача, есть класс которые принимает в конструкторе конфиг, читает его и выполняет действие. Естественно там есть глобальные переменные вида
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        private PConfiguration f_configuration = null;
 
        public PConfiguration Configuration
        {
            get
            {
                return f_configuration;
            }
            set
            {
                f_configuration = value;
            }
        }
Которые на все потоки оказываются одинаковые, и получается что все потоки будут выполнять только тот конфиг, который считался последним.. В общем-то вопрос кто как с этим борется?

Для примера написал маленькую консольную программку, которая иллюстрирует проблему

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
49
50
51
52
53
54
55
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 0; i < 1000; i++)
            {
                Thread t = new Thread(()=>test(i));
                t.Start();
            }
            Console.Read();
        }
 
        private static void test(int b)
        {
            abc a = new abc(b);
        }
    }
 
    class abc
    {
        private int k = 0;
 
        public int test
        {
            get
            {
                return k;
            }
            set
            {
                k = value;
            }
        }
 
        public abc(int p)
        {
            test = p;
            run();
        }
 
        public void run()
        {
            Console.WriteLine(k);
        }
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.08.2014, 09:16
Ответы с готовыми решениями:

Embarcadero RAD Studio XE.Равные переменные типа real оказываются для Embarcadero не равными
Все переменные типа real.Вне зависимости от действительного равенства full становится false Например Код full:=true; ...

Массив с одинаковыми значениями
нужна программа которая будет определять есть ли одинаковые цифры в массиве введенном с клавиатуры

Массив с одинаковыми значениями
Почему, если скормить &quot;a&quot;,&quot;b&quot;,&quot;c&quot; получается &quot;ccc&quot; а не &quot;abc&quot; ? #include &lt;iostream&gt; #include &lt;string.h&gt; ...

24
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
07.08.2014, 11:51
Студворк — интернет-сервис помощи студентам
Slicker, Тогда только синхронизация. Понимаете, дело в том, что вызвав метод Start() для потока, это совершенно не значит, что поток запустится именно сию секунду... Мы просто просим планировщик потоков запустить новый поток, и все, а когда он его запустит - от нас не зависит. Да и, вы же сами говорите, что результаты потоков никак друг от друга не связаны. Сформируйте в цикле 1000 потоков, а потом их все запустите...

Добавлено через 5 минут
Slicker, ну вот как-то так... Цифры выводятся вразнобой временами (синхронизации нет, но она вам и не нужна, как я понял). Но по одному числу.
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using System.Threading;
 
namespace ConsoleApplication13
{
    class Program
    {
        static EventWaitHandle go = new AutoResetEvent(false);
 
        static void Main(string[] args)
        {
            Thread[] threads = new Thread[100];
            for (int i = 0; i < threads.Length; i++)
            {
                threads[i] = new Thread(new ParameterizedThreadStart(Test));
                   
            }
            int n = 0;
            foreach (Thread t in threads)
            {
                t.Start(n);
                n++;
            }
           
            Console.ReadLine();
        }
        static void Test(object i)
        {
            Console.WriteLine(i);
        }
    }
}
0
1168 / 886 / 517
Регистрация: 09.04.2014
Сообщений: 2,103
07.08.2014, 12:02
так работает
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        static void Main(string[] args)
        {
            for (int i = 0; i < 1000; i++)
            {
                Thread t = new Thread(test);
                t.Start(i);
            }
            Console.Read();
        }
 
        private static void test(object b)
        {
            abc a = new abc((int)b);
        }
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
07.08.2014, 12:14
nedel, тот же самый ParameterizedThreadStart, только неявно выведенный компилятором.
0
1168 / 886 / 517
Регистрация: 09.04.2014
Сообщений: 2,103
07.08.2014, 12:24
Цитата Сообщение от insite2012 Посмотреть сообщение
nedel, тот же самый ParameterizedThreadStart, только неявно выведенный компилятором.
согласен
0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
07.08.2014, 12:28
Цитата Сообщение от nedel Посмотреть сообщение
так работает
Да нет смысла городить костыли под изначально кривой дизайн. Такие вещи рефакторить чем позже тем больнее.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.08.2014, 12:28

Построение вектора с одинаковыми значениями
Здравствуйте. Помоги, пожалуйста, со следующей проблемой: есть вектор v, размерность которого меняется в зависимости от введенных данных....

Вложеный запрос с одинаковыми значениями
Вот запрос:SELECT Pupil FROM pupils WHERE CustNo4 = (SELECT CustNo4 FROM classpupil WHERE CustNo1 = (SELECT CustNo1 FROM classes WHERE...

Массив заполняется одинаковыми значениями
Друзья очень глупый вопрос. Прям стыдно в папке 4 файла /opt/.DS_Store /opt/1.dmg /opt/IMG_0264.CR2 /opt/IMG_0264.jpg но...

Объединение строк с одинаковыми значениями
Доброго времени суток! Подскажите, как изменив код SQL-запроса можно DBGrid избавиться от повторяющихся значений, другими словами,...

Замена строки с одинаковыми значениями
Доброго дня. Прошу помочь отладить данный код: cur.execute('SELECT * FROM tasks WHERE strftime(&quot;%m&quot;)') tasks...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru