Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++
Войти
Регистрация
Восстановить пароль
 
hiphone
13 / 13 / 7
Регистрация: 28.01.2012
Сообщений: 549
1

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

01.03.2015, 21:55. Просмотров 327. Ответов 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();
    }
}
0
Миниатюры
Самопроизвольное завершение потоков  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2015, 21:55
Ответы с готовыми решениями:

Звуковой драйвер не сообщяет о завершение воспроизведения
void CALLBACK func (HWAVEOUT hwi, UINT Msg, DWORD dwInstance, DWORD dwParam1,...

Синхронизация потоков с++
Реализовать модуль создающий 4 балансировочных потока обеспечивающий 100%...

Приоритеты потоков
Здравствуйте, пишу две программы, в одной из которых обработка данных просто...

Создание потоков
Всем доброго времени суток. Как всегда, последняя надежда на этот сайт. Сразу к...

Контроль звуковых потоков
Всем привет,не знал,где разместить тему,т.к вроде тема не для новичков,но на...

2
Dmitriy_M
1428 / 1308 / 131
Регистрация: 20.03.2009
Сообщений: 4,677
Записей в блоге: 11
02.03.2015, 11:19 2
C++
1
2
3
4
5
            m.lock();
            if (currAcc == all)
                return;
            l = lines[currAcc++];
            m.unlock();
Разве так можно делать?
0
DiffEreD
1442 / 779 / 257
Регистрация: 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";
}
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2015, 12:22

C++ MPI выделение потоков
Здравствуйте, я к вам с немного нубским вопросом. Написал вот такой код: ...

Причины последовательной работы потоков?
имею gcc 4.8 Следующий код: Имею такие глобальные переменные ...

Аналог потоков Delphi (TStream) в C++
Собственно, вопрос в названии. Есть ли аналог TStream в C++? Будьте добры,...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru