Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 23.10.2012
Сообщений: 97

Конфликт потоков, работающих с одним массивом

28.09.2014, 12:33. Показов 2563. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть 2 потока, первый инкрементирует массив, воторой декрементирует. В кнопке пишу такое создание потоков

C
1
2
hThread=(HANDLE)_beginthreadex(NULL, 0, &ThreadFunc1, NULL, 0, &ThreadId);
hThread=(HANDLE)_beginthreadex(NULL, 0, &ThreadFunc2, NULL, 0, &ThreadId);
Выдает ошибку. В чем может быть дело?
Миниатюры
Конфликт потоков, работающих с одним массивом  
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.09.2014, 12:33
Ответы с готовыми решениями:

Конфликт приложений работающих с сетью
Здравствуйте. На виртуальном сервере от ihor, стоит ubuntu 12.04. Почему то приложения подключающиеся к одним и тем же серверам, по...

Как подсчитать количество работающих потоков?
Доброго времени суток, подскажите пожалуйста, как в C# подсчитать работающие потоки и вывести их в Label? Thread p = new Thread; ...

Большое число потоков работающих с сетью
Проблема с большим числом потоков работающих с сетью порядка 5-7 тысяч периодически в лог валится вот такая ошибка Traceback...

10
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
28.09.2014, 12:40
Не "&ThreadFunc", а "ThreadFunc". И посмотрите в отладчике, в каком месте
происходит падение - на вызове _beginthreadex или внутри функции ThreadFunc.
0
0 / 0 / 0
Регистрация: 23.10.2012
Сообщений: 97
28.09.2014, 12:43  [ТС]
Исправила, такая же ошибка. Внутри ThreadFunc, когда пытается изменить значение элемента массива. Если использовать только один поток, все работает нормально
C
1
mass[i]=mass[i]+1;
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
28.09.2014, 12:49
Код ThreadFunc можете показать ?
0
0 / 0 / 0
Регистрация: 23.10.2012
Сообщений: 97
28.09.2014, 12:52  [ТС]
при нажатии на кнопку j=false

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
static unsigned __stdcall ThreadFunc1(void *iFH)
{
 
while(j)
{
if(i==9)
   {i=0;}
mass[i]=mass[i]+1;
i++;
kol++;
}
_endthreadex(0);
 return 0;
}
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
28.09.2014, 12:54
Лучший ответ Сообщение было отмечено _Sv_ как решение

Решение

Ну теперь вроде понятно.
"i", "j" и "kol" - внешние переменные (глобальные), которые используются обоими потоками.
И доступ к ним не синхронизирован, поэтому и "глюки".
1
0 / 0 / 0
Регистрация: 23.10.2012
Сообщений: 97
28.09.2014, 12:57  [ТС]
Спасибо Разобралась
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
28.09.2014, 13:02
Каждому потоку при запуске передать свою копию i, j и kol.
При этом в массиве будет "каша", думаю, Вы это понимаете.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
28.09.2014, 15:13
Цитата Сообщение от Убежденный Посмотреть сообщение
Не "&ThreadFunc", а "ThreadFunc".
Да нет разницы, разве что & дает знать что это указатель на ф-цию еще раз.

Добавлено через 1 минуту
Цитата Сообщение от _Sv_ Посмотреть сообщение
при нажатии на кнопку j=false
_Sv_, _beginthreadex не используют в VCL по этому советую посмотреть в сторону класса TThread.
1
28.09.2014, 16:41

Не по теме:


Цитата Сообщение от Avazart Посмотреть сообщение
Да нет разницы, разве что & дает знать что это указатель на ф-цию еще раз.
Согласен. Мне просто глаза режет :)

0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
28.09.2014, 17:20
Если наброском то так приблизительно:
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
//---------------------------------------------------------------------------
struct Data
{
    Data()
    {
        lock= new TCriticalSection;
        for(int i=0; i<10; ++i) array[i]= i;
    }
    ~Data(){  delete lock; }
 
    int array[10];
    TCriticalSection* lock;
} ;
//---------------------------------------------------------------------------
class MyThread: public TThread
{
    public:
 
    __fastcall MyThread(Data* data,int op,bool CreateSuspended):
         TThread(CreateSuspended),
         data_(data),
         op_(op)
    {
 
    }
 
    protected:
     void __fastcall Execute()
     {
        for(int i=0; i<10; ++i)
        {
            data_->lock->Enter();
            try
            {
                data_->array[i]+= op_;
            }
            __finally
            {
                data_->lock->Leave();
            }
        }
     }
 
    private:
        Data* data_;
        int op_;
};
 
Data data;
MyThread* thread1= 0;
MyThread* thread2= 0;
//---------------------------------------------------------------------------
void __fastcall TForm1::TerminateThreadX(TObject *Sender)
{
    if(Sender==thread1)
    {
        Memo1->Lines->Add("Поток #1 завершен.");
        thread1= 0;
    }
    else
        if(Sender==thread2)
        {
            Memo1->Lines->Add("Поток #2 завершен.");
            thread2= 0;
        }
 
    if(!thread1 && !thread2)
    {
        Memo1->Lines->Add("Массив:");
        for(int i=0; i<10; ++i)
        {
            Memo1->Lines->Add(data.array[i]);
        }
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    thread1= new MyThread(&data,+1,true);
    thread1->OnTerminate= &TerminateThreadX;
    thread1->FreeOnTerminate= true;
    thread1->Start();
 
    thread2= new MyThread(&data,-1,true);
    thread2->OnTerminate= &TerminateThreadX;
    thread2->FreeOnTerminate= true;
    thread2->Start();
}
//---------------------------------------------------------------------------
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.09.2014, 17:20
Помогаю со студенческими работами здесь

Ограниченное количество одновременно работающих потоков без ThreadPool
К делу. Так это работает в ThreadPool ThreadPool.QueueUserWorkItem(clientObject.Process); ThreadPool.SetMaxThreads(3, 3); Как это...

Сделать не с 3-мя, а с одним массивом
Вот выглядит это так, нужно сделать тоже самое только с одним массивом, не динамическим, всё равно что будет много ресурсов жрать, главное...

Работа с одним массивом
подскажите как сделать так, чтобы постоянно работать с исходным массивом)вот допустим есть исходный массив, одна функция изменяет один...

Корректировка работы нескольких потоков с одним циклом
Привет. Ребята, нужна ваша помощь. Не могу распаралелить поток. namespace potok { public partial class Form1 : Form { ...

Как организовать корректную работу потоков с одним файлом
private void button1_Click(object sender, EventArgs e) { for (int p = 0; p &lt; 2; p++) { ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru