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

C++

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

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

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

Звуковой драйвер не сообщяет о завершение воспроизведения - C++
void CALLBACK func (HWAVEOUT hwi, UINT Msg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2){ if (Msg == WOM_OPEN)...

Приоритеты потоков - C++
Здравствуйте, пишу две программы, в одной из которых обработка данных просто делится на потоки, а в другой я ещё придаю потокам более...

Создание потоков - C++
Всем доброго времени суток. Как всегда, последняя надежда на этот сайт. Сразу к делу: Написать программу, которая принимает в качестве...

Контроль звуковых потоков - C++
Всем привет,не знал,где разместить тему,т.к вроде тема не для новичков,но на эксперта не тянет. Проблема следующая,необходимо получить...

C++ MPI выделение потоков - C++
Здравствуйте, я к вам с немного нубским вопросом. Написал вот такой код: #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;ctime&gt; ...

Причины последовательной работы потоков? - C++
имею gcc 4.8 Следующий код: Имею такие глобальные переменные int thread_started_count = 0; // счетчик-барьер кол-ва...

2
Dmitriy_M
1357 / 1240 / 114
Регистрация: 20.03.2009
Сообщений: 4,442
Записей в блоге: 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
1431 / 768 / 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";
}
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2015, 12:22
Привет! Вот еще темы с ответами:

Использование данных из разных потоков - C++
Привет всем! Возникла проблема с использованием данных из разных потоков в многопоточном приложении 1) Допустим созданы два...

Многопоточность - правильное завершение потоков - C++ Builder
Вот первый вопрос: 1) Как завершить заданное количество потоков. Pars - это потомок класса TThread Pars *Thr; - задано глобально. ...

Самопроизвольное изменение размеров окна - C++ Builder
Создаю форму bsDialog, всякие там кнопочки, короче приложение, которое при запуске должно сразу отображаться на экране, размер 234*492. Так...

Самопроизвольное заполнение Series[0]->Title - C++ Builder
Работаю с динамически создаваемыми сериями графиков. Если делаю несколько, и устанавливаю их имена (Form1-&gt;Chart1-&gt;Series-&gt;Title=&quot;*****&quot;;),...


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

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

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