Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.87/30: Рейтинг темы: голосов - 30, средняя оценка - 4.87
2 / 2 / 3
Регистрация: 04.12.2015
Сообщений: 114

Многопоточность, _beginthreadex, ошибка ntdll.dll

28.10.2016, 00:26. Показов 6928. Ответов 70
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, собственно сабж.

Посмотрите пожалуйста комментарии в коде. Как исправить ситуацию, не правильно запускаются потоки?

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
 unsigned __stdcall potok(void* Param)
 {
//Собственно тут код может быть любой на частоту появления ошибки вообще никак не влияет,
// я Комментировал вообще все подряд, все равно лезет ошибка
 
     static int *p = (int*)Param;
 
     char buffer[100];
     wsprintf(buffer, "%u", *p);
     MessageBox(0, buffer, "", 0); 
 
     delete[] buffer;
 
     _endthreadex(0);
     return 0;
 }
 
int main()
{
    for (int i = 0; i < 50; i++)
    {
//      Sleep(900); // Если ставить паузу между запусками потоков, то проблема появляется значительно реже,
              // но появляется так, или иначе в любом случае, без паузы у меня в9 из 10 ловится ошибка.
 
        try
        {
            _beginthreadex(NULL, 0, &potok, (void*)&i, 0, NULL);  
        }
    
        catch (char *str)
        {
            printf("Error '%s'!\n", str);
        }
    }
 
    _endthreadex(0);
return 0;
}
При выполнение этого кода, вылетает ошибка
Вызвано исключение по адресу 0x77456D39 (ntdll.dll) в CSmtp.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0x00000014.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.10.2016, 00:26
Ответы с готовыми решениями:

Вызвано исключение по адресу 0x772C09D6 (ntdll.dll)
Здравствуйте. Имеется проблема: при добавлении данного перечня заголовков в VS (всех вместе или каждого по отдельности) компиляция...

Исключение по адресу 0x77785BE7 (ntdll.dll) в lagranz_interpolution.exe: 0xC0000005
Вызвано исключение по адресу 0x77785BE7 (ntdll.dll) в lagranz_interpolution.exe: 0xC0000005: нарушение прав доступа при чтении по адресу...

При запуске своей проги на Windows 7, ругается на ntdll.dll
Прогу пишу в BDS2006, а проблема по всей видимости из-за того, что запускать её пришлось в ОС x64... Подскажите (желательно срочно -...

70
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13184 / 6820 / 1821
Регистрация: 18.10.2014
Сообщений: 17,260
28.10.2016, 00:41
Цитата Сообщение от lostandleft Посмотреть сообщение
C++
1
2
3
char buffer[100];
...
delete[] buffer;
А это что за ужас? Кто вам разрешил делать delete на локальный массив? Сколько раз объяснять, что делать delete надо только на то, на что делали new. У вас есть в программе new? Нет. Так откуда взялось вдруг delete?
0
2 / 2 / 3
Регистрация: 04.12.2015
Сообщений: 114
28.10.2016, 00:43  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
А это что за ужас? Кто вам разрешил делать delete на локальный массив?
Да согласен, delete вписал уже от безысходности, уже не знаю в какую стену бомбиться, повторюсь код может в потоке быть вообще любой, у меня выплевывается ошибка даже с обычным cout, если Вам не лень попробуйте.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13184 / 6820 / 1821
Регистрация: 18.10.2014
Сообщений: 17,260
28.10.2016, 00:44
Цитата Сообщение от lostandleft Посмотреть сообщение
_endthreadex(0);
Это не ошибка, но тем не менее вызывать _endthreadex руками в этом случае никакой необходимости нет.
0
2 / 2 / 3
Регистрация: 04.12.2015
Сообщений: 114
28.10.2016, 00:52  [ТС]
Код пишется в VS2015, если это важно, не знаю.
Система win8 после обновления с win7 установлена накатом одной на другую, не чистая установка.
Может быть в этом проблема и она только у меня, локальная, на других машинах должно быть все в порядке, или проблема именно в запуске моего кривого кода?
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
28.10.2016, 00:58
Цитата Сообщение от lostandleft Посмотреть сообщение
уже не знаю в какую стену бомбиться
В main нужно дожидаться завершения всех потоков, если я не ошибаюсь.
https://msdn.microsoft.com/ru-... ttdcb.aspx
https://msdn.microsoft.com/ru-... s.85).aspx
https://www.opennet.ru/docs/RU... ode48.html
2
2 / 2 / 3
Регистрация: 04.12.2015
Сообщений: 114
28.10.2016, 01:12  [ТС]
Цитата Сообщение от Max Dark Посмотреть сообщение
В main нужно дожидаться завершения всех потоков, если я не ошибаюсь.
Спасибо за подсказку, но с буржуйским не очень хорошо, но попробую конечно порыть.
Может в 2х словах наводку дадите еще?
Как заставить ожидать завершения всех потоков?
Главное что забавно, в дебагере только ошибка вылетает, если запускать откомпилированный EXE то никаких проблем я не вижу, ошибка не ловится.

Добавлено через 5 минут
PS Хорошее описание по ссылкам, курю сижу, хоть и с трудом
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
28.10.2016, 01:20
Лучший ответ Сообщение было отмечено lostandleft как решение

Решение

Цитата Сообщение от lostandleft Посмотреть сообщение
Как заставить ожидать завершения всех потоков?
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
#include <windows.h>
#include <process.h>
#include <iostream>
 
unsigned __stdcall potok(void* Param)
{
    int p = (int)Param;
    std::cout << p << std::endl;
    return 0;
}
 
int main()
{
    const int N = 50;
    HANDLE h[N];
    for (int i = 0; i < N; i++)
    {
        h[i] = (HANDLE)_beginthreadex(NULL, 0, &potok, (void*)i, 0, NULL);  // запоминаем ID потока
       
    }
 
    WaitForMultipleObjects(N, h, TRUE, INFINITE); // ждем
    return 0;
}
http://rextester.com/VSAGVM84178
1
2 / 2 / 3
Регистрация: 04.12.2015
Сообщений: 114
28.10.2016, 22:49  [ТС]
Спасибо за подсказки буду курить, с многопоточностью по верхам не попрыгаешь, нужно вникать в суть, или наломать можно, спасибо еще раз буду читать ссылки.

Добавлено через 21 час 24 минуты
Почитал ссылки в меру своего понимания обнаружил, что существует 2 варианта ожидания завершения потоков WaitForMultipleObjects который предложили выше и WaitForSingleObject.

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

Также обнаружил что рекомендуется использовать функцию CloseHandle(myHandle), чтобы закрывать отработавшие потоки.
Но с ней я несколько обескуражен, не могу понять как именно определить когда поток выполнен и когда его уже можно закрывать.

Теперь на примере кода что именно мне не понятно:

1 - Я все равно имею ошибку в приведенном ранее коде, есши меняю количество потоков и устанавливаю их больше 150 например.
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
#include <windows.h>
#include <process.h>
#include <iostream>
 
unsigned __stdcall potok(void* Param)
{
     int p = (int) Param;
     char buffer[100];
     wsprintf(buffer, "%u", p);
     MessageBox(0, buffer, "", 0);
 
    _endthreadex(0); //люблю чувство контроля пусть и лживое
    return 0;
}
 
int main()
{
    const int N = 150; // Вылетает все та же самая ошибка ": 0xC0000005: нарушение прав доступа при записи по адресу 0x00000014"
    HANDLE h[N];
    for (int i = 0; i < N; i++)
    {
        h[i] = (HANDLE)_beginthreadex(NULL, 0, &potok, (void*)i, 0, NULL);  // запоминаем ID потока
     }
 
    WaitForMultipleObjects(N, h, TRUE, INFINITE); // ждем
    return 0;
}
Проблему удается решить изменив код на такой:

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
#include <windows.h>
#include <process.h>
#include <iostream>
 
unsigned __stdcall potok(void* Param)
{
     int p = (int) Param;
     char buffer[100];
     wsprintf(buffer, "%u", p);
     MessageBox(0, buffer, "", 0);
 
    _endthreadex(0); //люблю чувство контроля пусть и лживое
    return 0;
}
 
int main()
{
 
    const int N = 150;
    HANDLE h[N];
    for (int i = 0; i < N; i++)
    {
        h[i] = (HANDLE)_beginthreadex(NULL, 0, &potok, (void*)i, 0, NULL);
        WaitForSingleObject(h[i], INFINITE); // вставляем последовательное ожидание и проблемы нет
    }
 
 
 
    return 0;
    
 
}
Но ведь это пардон маразм, какой же это параллелизм, ожидать завершение одного потока, для того чтобы начать другой.
Помогите разобраться до конца.

А также пожалуйста поясните на сколько критично использовать

C++
1
        CloseHandle(h[i]);
И как правильно это сделать в первом случае и во втором.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
28.10.2016, 23:05
Это всё какое отношение имеет к С++?
0
2 / 2 / 3
Регистрация: 04.12.2015
Сообщений: 114
28.10.2016, 23:06  [ТС]
Пардон, я не в той ветке разместился Вы считаете?
Вроде код с++ ... или я не понимаю суть вопроса, или откройте мне какую-то сакральную истину?

Мне в общем то проблему бы решить, ну или хотя-бы понять как она решается.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
28.10.2016, 23:08
Цитата Сообщение от lostandleft Посмотреть сообщение
Вроде код с++ ...
В С++ свои потоки: http://ru.cppreference.com/w/cpp/thread
0
2 / 2 / 3
Регистрация: 04.12.2015
Сообщений: 114
28.10.2016, 23:13  [ТС]
Хорошая колкость, а по существу темы?
Или Вы мне указываете на другую ветку, или вообще на другой форум?

Может быть предложите правильный вариант кода в рамках правоверности c++?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
28.10.2016, 23:20
Цитата Сообщение от lostandleft Посмотреть сообщение
Хорошая колкость,
И в чём колкость? В том, что в С++ свои потоки?
Цитата Сообщение от lostandleft Посмотреть сообщение
Или Вы мне указываете на другую ветку, или вообще на другой форум?
Если бы знал точно куда указать, давно бы указал. Знаю только, что к C++ данный код не имеет никакого отношения.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
28.10.2016, 23:30
Цитата Сообщение от nd2 Посмотреть сообщение
Знаю только, что к C++ данный код не имеет никакого отношения.
Про WinAPI не слышали? Вообще, скорее всего, std::thread это просто обёртка вокруг WinAPI, ну, для виндовс по крайней мере.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
28.10.2016, 23:34
Цитата Сообщение от GbaLog- Посмотреть сообщение
Про WinAPI не слышали?
И что? Хочешь сказать, что WinAPI == С++? GbaLog-, не смеши...
Цитата Сообщение от GbaLog- Посмотреть сообщение
WinAPI
https://www.cyberforum.ru/win-api/
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
28.10.2016, 23:43
Цитата Сообщение от nd2 Посмотреть сообщение
Хочешь сказать
Хочу сказать, что Вы, скорее всего, просто не понимаете, что "волшебная" кроссплатформенность реализуется чаще всего с помощью конфигов из макросов, которые разруливают всю компиляцию.
А ещё хочу сказать, что WinAPI != C++, но С++ в виндовс может брать какие-либо вещи из WinAPI, чтобы было легче реализовать. Так вот, в WinAPI существуют потоки, почему бы не использовать стандартную надстройку над ОС, чтобы сделать свои потоки?
Если о компиляции непонятно, то скомпилируйте этот код на линуксе и на виндовс отдельно и посмотрите результат.
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
 
int main()
{
    #ifdef _WIN32 || _WIN64
        std::cout << "Hello, Windows" << std::endl;
    #elif __linux__
        std::cout << "Hello, Linux" << std::endl;
    #endif
}
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
28.10.2016, 23:49
Цитата Сообщение от GbaLog- Посмотреть сообщение
Хочу сказать, что Вы, скорее всего, просто не понимаете, что "волшебная" кроссплатформенность реализуется чаще всего с помощью конфигов из макросов, которые разруливают всю компиляцию.
Мне глубоко плевать на кроссплатформенность, и на то, как, и что там реализуется. Я знаю, что в С++ нет этого:
Цитата Сообщение от lostandleft Посмотреть сообщение
_beginthreadex
Цитата Сообщение от lostandleft Посмотреть сообщение
_endthreadex(0)
Цитата Сообщение от lostandleft Посмотреть сообщение
WaitForSingleObject
Цитата Сообщение от lostandleft Посмотреть сообщение
HANDLE
Цитата Сообщение от lostandleft Посмотреть сообщение
MessageBox
О чём я и написал:
Цитата Сообщение от nd2 Посмотреть сообщение
Это всё какое отношение имеет к С++?
0
2 / 2 / 3
Регистрация: 04.12.2015
Сообщений: 114
29.10.2016, 00:02  [ТС]
Блин ребят, вы может в личке бомбить друг другу будете?
По существу ответ на тему никто из профессионалов не имеет, хоть на нативном с++ хоть через winapi?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
29.10.2016, 00:06
Цитата Сообщение от lostandleft Посмотреть сообщение
хоть на нативном с++ хоть через winapi?
На нативном С++ такого не существует, а через winapi: https://www.cyberforum.ru/win-api/
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.10.2016, 00:06
Помогаю со студенческими работами здесь

Exception thrown at 0x77D75BCA (ntdll.dll): 0xC0000005: Access violation reading location 0x0000
Есть задача Есть решение Основное приложение: #include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include...

Необработанное исключение по адресу 0x0000000077651DA0 (ntdll.dll) в ProjecktExperement2.exe: 0xC0000005: нарушение прав
Необработанное исключение по адресу 0x0000000077651DA0 (ntdll.dll) в ProjecktExperement2.exe: 0xC0000005: нарушение прав доступа при чтении...

CreateThread или beginthreadex
Как-то так повелось что при создании потока я использую ф-цию CreateThread. Тем не менее, все почему-то советуют пользоваться...

Ошибка ntdll.dll
Всем привет! У меня Macbook Pro Retina 13' 2015 (128gb) и у меня проблема с запуском игры на нем. Установил Windows 8.1 через Bootcamp,...

Wine - Ошибка ntdll.dll
Приветствую товарищи! Обращаюсь к вам с проблемой. Поставил я вайн на убунту и хочу юзать http://www.rstat.ru/RetailStat_2.4.zip...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru