Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
hiphone
13 / 13 / 3
Регистрация: 28.01.2012
Сообщений: 543
#1

Самопроизвольное завершение потоков - C++

01.03.2015, 21:55. Просмотров 261. Ответов 2
Метки нет (Все метки)

Здравствуйте, делаю многопоточное приложение, пробовал использовать бустовские потоки и std потоки, но в обоих происходит завершение потоков, причем их работа до конца не доходит (стоит брэйкпоинт).

С чем это связано и как с этим бороться?

И сразу же еще вопрос, запускаю 10 бустовских потоков, но почему-то их становится 20, с std такой проблемы нет

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
for (int i = 0; i < threads; i++) {
        std::thread(Job).detach();
    }
 
 
void Job() {
    try{
        m.lock();
        cout << "Thread Start" << endl;
        m.unlock();
        while (true) {
            string l;
            m.lock();
            if (currAcc == all)
                return;
            l = lines[currAcc++];
            m.unlock();
            bool ch;
            do {
                ch = dvaCh(l);
            } while (!ch);
            l.clear();
        }
        m.lock();
        cout << "Thread End" << endl;
        m.unlock();
    }
    catch (...) {
        Job();
    }
}
Миниатюры
Самопроизвольное завершение потоков  
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2015, 21:55     Самопроизвольное завершение потоков
Посмотрите здесь:

Завершение потока! C++ Builder
Завершение процесса C++ Builder
Завершение потока C++ Builder
Самопроизвольное обнуление константы C++
Выход из программы и самопроизвольное выполнение пункта C++
C++ Builder Самопроизвольное изменение размеров окна
Завершение потоков POSIX C++ Linux
C++ Завершение потока
C++ завершение программы
C++ Самопроизвольное добавление чисел
Самопроизвольное заполнение Series[0]->Title C++ Builder
Многопоточность - правильное завершение потоков C++ Builder

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dmitriy_M
1334 / 1215 / 110
Регистрация: 20.03.2009
Сообщений: 4,338
Записей в блоге: 11
02.03.2015, 11:19     Самопроизвольное завершение потоков #2
C++
1
2
3
4
5
            m.lock();
            if (currAcc == all)
                return;
            l = lines[currAcc++];
            m.unlock();
Разве так можно делать?
DiffEreD
1427 / 764 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
02.03.2015, 12:22     Самопроизвольное завершение потоков #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от hiphone Посмотреть сообщение
С чем это связано
Наверное с тем, что потоки детачатся. Их надо как то отлавливать, пока все потоки не завершатся. Вот могу подкинуть свой учебный код для примера:
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
#include <iostream>
#include <string>
#include <thread>
#include <mutex>
#include <chrono>
#include <condition_variable>
 
std::mutex m;
std::condition_variable cv;
std::string data;
int num_thread = 10;
 
// просто функция, которая что то там вычисляет:
unsigned long long fib(std::size_t i) { return i < 3 ? 1 : fib(i - 1) + fib(i - 2); }
 
void work(unsigned i, unsigned thread_id)
{
   std::unique_lock<std::mutex> lk(m);
   std::cout << "Thread " << thread_id << " started...\n";
   lk.unlock();
 
   fib(i); // емулируем  нагрузку
 
   lk.lock();
   data += std::to_string(thread_id);
   --num_thread;
   std::cout << "Thread " << thread_id << " stopped...\n";
   cv.notify_one(); // маячим, что завершили работу
}
 
int main()
{
   for (std::size_t i = 0; i < num_thread; ++i)
   {
      std::thread t(work, 42, i+1);
      t.detach();
   }
 
   std::unique_lock<std::mutex> lk(m);
   // блокируем мютекс на 1 сек. и ждем когда последний поток промаячет нам
   // через notify_one(). При этом num_thread должно быть 0
   while(!cv.wait_for(lk, std::chrono::seconds(1), []{return num_thread == 0;}))
   {}
 
   std::cout << "All threads finished.\n";
   std::cout << "Data: " << data << "\n";
}
Yandex
Объявления
02.03.2015, 12:22     Самопроизвольное завершение потоков
Ответ Создать тему
Опции темы

Текущее время: 16:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru