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

Причины последовательной работы потоков? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Ошибка parameter declared 'auto' http://www.cyberforum.ru/cpp/thread1832823.html
Код: #include <algorithm> #include <iostream> #include <set> #include <vector> /////////////////////////////////////////////////////////////////////////////// class T_official;...
C++ При пересечении процента с долларом в консоли доллар должен исчезнуть Доброго времени суток. Не так давно начал изучать основы OpenGL, а параллельно с ним ООП и вектора, что идёт не очень успешно. Объединить у меня это никак не получается, так как я не знаю, как... http://www.cyberforum.ru/cpp/thread1832213.html
Графические библиотеки C++
Добрый день. Недавно решил начать программировать какую-нибудь простенькую 3D игру, но столкнулся с проблемой. Не могу решить какую графическую библиотеку использовать. Просмотрел множество...
Ошибка "is block type valid" в момент вывода картинки OpenCV C++
Здравствуйте. Имеется код. Он есть в файлах opencv source, немного изменён. Не сразу заработал, но всё равно осталась ошибка. В момент вывода картинки imshow("output", frame); выводится ошибка is...
C++ Как вывести эту матрицу? http://www.cyberforum.ru/cpp/thread1825616.html
Добрый вечер) Дайте пожалуйста совет не опытному программисту, как справиться с такой задачей: дали задание, составить таблицу остатков от деления всех чисел типа unsigned short int (0 / 65 535) на...
C++ Чтение файла (с кракозябрами) с однобайтовой кодировкой, конвертация в UTF-8 и вывод в другой файл Добрый день, форумчане. Может у кого есть заготовка или кто поделится советом, необходимо прочитать файл (с кракозябрами) с однобайтовой кодировкой, переконвертировать в UTF-8 и выввести в другой... подробнее

Показать сообщение отдельно
karat39
4 / 4 / 1
Регистрация: 09.02.2016
Сообщений: 101

Причины последовательной работы потоков? - C++

24.10.2016, 17:48. Просмотров 257. Ответов 4
Метки (Все метки)

имею gcc 4.8
Следующий код:

Имею такие глобальные переменные

C++
1
2
3
4
5
6
7
int                             thread_started_count = 0;   // счетчик-барьер кол-ва потоков
std::thread                     thread_1;                   // поток 1
std::thread                     thread_2;                   // поток 2
std::mutex                      thread_count_busy;          // мьютекс для счетчика
std::mutex                      search_busy;                // мьютекс, только для condition_variable
std::unique_lock<std::mutex>    lck(search_busy);           
std::condition_variable         start_search;               // condition_variable для оповещения, что можно стартовать потокам
Имею две однотипные функции для двух потоков.
Первая
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void    thread_work_1 () {
    thread_count_busy.lock();
    thread_started_count++;
    thread_count_busy.unlock(); 
    
    while (true) {
        printf ("\n now waiting 1...\n");
        start_search.wait(lck);
        printf ("\n starting 1...\n");
        int n = 0;
        while (n < 100) {
            printf (" 1");  
            n++;
        }
    }
}
Вторая
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void    thread_work_2 () {
    thread_count_busy.lock();
    thread_started_count++;
    thread_count_busy.unlock();
    
    while (true) {
        printf ("\n now waiting 2...\n");
        start_search.wait(lck);
        printf ("\n starting 2...\n");
        int n = 0;
        while (n < 100) {
            printf (" 2");
            n++;
        }
    }
}
Основная программа
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main () {
 
    printf ("program started\n");
    
    thread_1 = std::thread (thread_work_1);
    thread_2 = std::thread (thread_work_2);
    
    thread_1.detach();  
    thread_2.detach();
    while (thread_started_count != 2) {usleep (1);}
 
    start_search.notify_all();
 
    int n = 0;
    while (true) {
        if (n == 500) {
            start_search.notify_all();
            n = 0;
        }
        n++;
    }
}
Логика очень простая.
1) Создаю два потока и запускаю их в фон.
2) Потоки запускаются и переходят в спящий режим
3) Когда счетчик запущенных потоков =2, то пробуждаем потоки, они начинают работать.
4) Потоки просто выводят на экран 100 цифр. И заново засыпают.
5) В основном потоке (программе) при счетчике n = 500, потоки опять будятся. И так все зацикленно.

Внимание. Вопрос.
Получаю некий результат
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
program started
 
 now waiting 1...
 
 now waiting 2...
 
 starting 1...
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 now waiting 1...
 
 starting 2...
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 now waiting 2...
 
 starting 1...
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 now waiting 1...
 
 starting 2...
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 now waiting 2...
Как видим, потоки работают по очереди. Не пойму почему так. Где закралась ошибка? Прошу помощь зала.
Если избавляюсь в коде от condition_variable, то потоки действительно принтуют в разнобой, то есть работают параллельно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru