Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
143 / 92 / 34
Регистрация: 30.01.2018
Сообщений: 469

Почему ошибка сегментирования (многопоточность)

24.03.2019, 18:17. Показов 2663. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, проблема следующая: когда я пытаюсь разделить график и логику приложения в разные потоки, оно работает нормально, но при закрытии окна вылетает ошибка сегментации (опустил сам класс объекта, так как он не играет роли)
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
#include "Physics.hpp"
#include "TimePoint.hpp"
#include "Clock.hpp"
 
#include <SFML/Graphics.hpp>
#include <SFML/Graphics/Drawable.hpp>
 
#include <iostream>
#include <iomanip>
#include <thread>
#include <stdexcept>
 
 
int main()
{
    Clock clock;
    Cube cube(clock.duration,std::chrono::seconds(1), 500, microseconds(3'000'000), sf::Color::White);
    Cube cube2(clock.duration,microseconds(1'000'000), 700, microseconds(2'000'000), sf::Color::Red);
    sf::RenderWindow window(sf::VideoMode(1000, 768), "Test");
    window.setFramerateLimit(300);
 
    std::thread drawing([&window, &cube,&cube2]()
    {
         while(window.isOpen())
         {
             sf::Event event;
            while (window.pollEvent(event))
            {
               if (event.type == sf::Event::Closed)
               {
                   window.close();
               }
            }   
          window.clear();
          window.draw(cube.shape);
          window.draw(cube2.shape);
          window.display();
         }
    });
 
 
         while(window.isOpen())
         {
          clock.update();
          cube.update();
          cube2.update();        
         }
         drawing.detach();
 
         return 0;
     
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.03.2019, 18:17
Ответы с готовыми решениями:

Ошибка в коде (Ошибка сегментирования (core dumped)
Добрый день. Подскажите пожалуйста, где ошибка в коде? char ch; string s; while ((ch = cin.get()) != '0' ) ...

Ошибка сегментирования
Всем привет. Ситуация такая: У меня есть g++ версии &quot;gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1)&quot; Написал простенькую...

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

12
 Аватар для igorrr37
2869 / 2016 / 991
Регистрация: 21.12.2010
Сообщений: 3,720
Записей в блоге: 15
24.03.2019, 19:48
Что если вызвать detach сразу после создания треда
0
143 / 92 / 34
Регистрация: 30.01.2018
Сообщений: 469
24.03.2019, 20:18  [ТС]
Цитата Сообщение от igorrr37 Посмотреть сообщение
Что если вызвать detach сразу после создания треда
То же самое, хотя если оставить лямбду пустой, то все нормально
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
24.03.2019, 20:26
Лучший ответ Сообщение было отмечено Pashka Durov как решение

Решение

Pashka Durov, во-первых, Вы пошарили данные между потоками, но никакой синхронизации не сделали, а во-вторых, перед запуском потока необходимо деактивировать окно и активировать его уже в потоке рендеринга.
1
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
24.03.2019, 20:30
Лучший ответ Сообщение было отмечено Pashka Durov как решение

Решение

Pashka Durov, в дополнение к ответу выше, detach замените на join.
1
143 / 92 / 34
Регистрация: 30.01.2018
Сообщений: 469
24.03.2019, 20:32  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
detach замените на join.
То же самое

Цитата Сообщение от DrOffset Посмотреть сообщение
работу с примитивами SFML вы можете делать только в одном потоке (речь о window.isOpen()).
Цитата Сообщение от Croessmah Посмотреть сообщение
перед запуском потока необходимо деактивировать окно и активировать его уже в потоке рендеринга.
Сейчас поиграюсь, спасибо
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
24.03.2019, 20:34
Про активацию и деактивацию контекста есть на сайте SFML:
https://www.sfml-dev.org/tutor... om-threads
1
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
24.03.2019, 20:36
Цитата Сообщение от Pashka Durov Посмотреть сообщение
То же самое
Это будет работать только в комбинации с советами от Croessmah.
Просто с detach есть риск завершить основной поток управления раньше, чем закончится выполнение второго потока, что приведет к неопределенному поведению.
0
143 / 92 / 34
Регистрация: 30.01.2018
Сообщений: 469
24.03.2019, 20:47  [ТС]
Да, все заработало.
Для нашедших эту страничку форума:
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
int main()
{
    std::mutex mtx;
    Clock clock;
    Cube cube(clock.duration,std::chrono::seconds(1), 500, microseconds(3'000'000), sf::Color::White);
    Cube cube2(clock.duration,microseconds(1'000'000), 700, microseconds(2'000'000), sf::Color::Red);
    sf::RenderWindow window(sf::VideoMode(1000, 768), "Test");
    window.setFramerateLimit(300);
    window.setActive(false); //Добавили
    std::thread drawing([&window, &cube,&cube2]()
    {
        window.setActive(true); //Добавили
         while(window.isOpen())
         {
          window.clear();
          window.draw(cube.shape);
          window.draw(cube2.shape);
          window.display();
         }
    });
    
 
 
         while(window.isOpen())
         {
             sf::Event event;
            while (window.pollEvent(event))
            {
               if (event.type == sf::Event::Closed)
               {
                   window.close();
               }
            }   
          clock.update();
          cube.update();
          cube2.update();        
         }
         drawing.join();
 
         return 0;
     
}


Цитата Сообщение от Croessmah Посмотреть сообщение
Вы пошарили данные между потоками, но никакой синхронизации не сделали
А зачем делать синхронизацию, если в отрисовке по сути идет просто чтение, а не изменение?

Добавлено через 6 минут
А нет, оно работает через раз, правда ошибка уже следующая:

[xcb] Unknown sequence number while processing queue
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.
Cube: ../../src/xcb_io.c:263: poll_for_event: Assertion `!xcb_xlib_threads_sequence_lost' failed.
Аварийный останов (стек памяти сброшен на диск)
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
24.03.2019, 20:55
Цитата Сообщение от Pashka Durov Посмотреть сообщение
А зачем делать синхронизацию, если в отрисовке по сути идет просто чтение, а не изменение?
Но update-то, наверное, что-то меняет.
0
143 / 92 / 34
Регистрация: 30.01.2018
Сообщений: 469
24.03.2019, 20:56  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
Но update-то, наверное, что-то меняет
Он же в логике
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
24.03.2019, 20:57
Цитата Сообщение от Pashka Durov Посмотреть сообщение
Он же в логике
У Вас два потока работают с одними и теми же данными.
Вот представьте, что один поток делает cube.update(),
а второй в это время делает window.draw(cube.shape);.
В общем случае без синхронизации результат непредсказуем.
0
143 / 92 / 34
Регистрация: 30.01.2018
Сообщений: 469
24.03.2019, 20:59  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
В общем случае без синхронизации результат непредсказуем.
Хм, и в правду, учту
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.03.2019, 20:59
Помогаю со студенческими работами здесь

ошибка сегментирования
При запуске скомпилированной (gcc) программы выскакивает ошибка сегментирования, а при запуске ее же в дебагере (gdb) -- program exited...

Ошибка сегментирования
Написал я быдлокодик, вроде компилируется даже. Но при запуске под Linux'ом вылетает ошибка сегментирования, не могу понять откуда она. ...

Ошибка сегментирования.
Всем доброго времени суток! Помогите пожалуйста разобраться в чем дело, пишу программу( суть найти путь в дереве, но думаю это не будет...

Ошибка сегментирования
#include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;unistd.h&gt; #include &lt;fcntl.h&gt; #include &lt;string.h&gt; using...

Ошибка сегментирования
Добрый день, возникла проблема: Вот программа, суть из исходного файла у слов удаляется окончание 's' (если оно присутствует), плюс даны...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru