Здравствуйте! В продолжении темы "Потоки С++ Linux".
В ходе тестирования программы установил, что даже если потоки не работают с устройством ввода/вывода,
они все равно выполняются по очереди. Т.е. когда запускается первый поток он начинает выполняться вместе с основным потоком, а 2-ой и все последующий ждут выполнения предыдущего. Почему? Как решить проблему?
Здравствуйте, serg097, Вы писали:
S>Здравствуйте! В продолжении темы "Потоки С++ Linux". S>В ходе тестирования программы установил, что даже если потоки не работают с устройством ввода/вывода, S>они все равно выполняются по очереди. Т.е. когда запускается первый поток он начинает выполняться вместе с основным потоком, а 2-ой и все последующий ждут выполнения предыдущего. Почему? Как решить проблему?
Здравствуйте, ioni, Вы писали:
I>Здравствуйте, serg097, Вы писали:
S>>Здравствуйте! В продолжении темы "Потоки С++ Linux". S>>В ходе тестирования программы установил, что даже если потоки не работают с устройством ввода/вывода, S>>они все равно выполняются по очереди. Т.е. когда запускается первый поток он начинает выполняться вместе с основным потоком, а 2-ой и все последующий ждут выполнения предыдущего. Почему? Как решить проблему?
Здравствуйте, serg097, Вы писали:
S>Здравствуйте, ioni, Вы писали:
I>>Здравствуйте, serg097, Вы писали:
S>>>Здравствуйте! В продолжении темы "Потоки С++ Linux". S>>>В ходе тестирования программы установил, что даже если потоки не работают с устройством ввода/вывода, S>>>они все равно выполняются по очереди. Т.е. когда запускается первый поток он начинает выполняться вместе с основным потоком, а 2-ой и все последующий ждут выполнения предыдущего. Почему? Как решить проблему?
I>>Видимо код в студию
во первых пользуемся форматированием
I>во вторых что примерно делает functions_pthread
I>а в третьих у вас сколько процессоров в системе I>и как вы определили то поведение какое описываете в своем вопросе
Когда тестировал функция functions_pthread просто в цикле записывает символы в строку.
Процесс один! При тестировании запускал 3 потока, которые записывали в одну строку символы, затем вывел ее на экран!
S>Когда тестировал функция functions_pthread просто в цикле записывает символы в строку. S>Процесс один! При тестировании запускал 3 потока, которые записывали в одну строку символы, затем вывел ее на экран!
Итак все три потока "лепят" в локальную для потока строку некоторые символы
по окончании выводят это все в одну консоль
никаких мыслей не возникло?
консоль это ресурс доступ к которому контролирует система
так что как мне кажется вполне нормальное поведение
или вы хотели чего то неожиданного?
Здравствуйте, ioni, Вы писали:
S>>Когда тестировал функция functions_pthread просто в цикле записывает символы в строку. S>>Процесс один! При тестировании запускал 3 потока, которые записывали в одну строку символы, затем вывел ее на экран!
I>Итак все три потока "лепят" в локальную для потока строку некоторые символы I>по окончании выводят это все в одну консоль I>никаких мыслей не возникло?
I>консоль это ресурс доступ к которому контролирует система I>так что как мне кажется вполне нормальное поведение I>или вы хотели чего то неожиданного?
если строка одна на все потоки то вы видимо контролируете
доступ к ней каким нибудь мутексом
а так как потоки имееют одинаковый приоритет
то все отдается на откуп оперционной системе
"кто первый встал того и тапки"
так что опять ничего неожиаданного
Здравствуйте, ioni, Вы писали:
S>>Когда тестировал функция functions_pthread просто в цикле записывает символы в строку. S>>Процесс один! При тестировании запускал 3 потока, которые записывали в одну строку символы, затем вывел ее на экран!
I>Итак все три потока "лепят" в локальную для потока строку некоторые символы I>по окончании выводят это все в одну консоль I>никаких мыслей не возникло?
I>консоль это ресурс доступ к которому контролирует система I>так что как мне кажется вполне нормальное поведение I>или вы хотели чего то неожиданного?
НЕТ! Строка нелокальная, она глобальная!
3 потока + основной поток!
Строка выводиться на экран после завершения всех потоков!
Пример: Если каждый поток печатает свой номер, главный поток выводит "-", то результат
--------111111-11111-111-11111-11-------2222-2222-22222222222----33333-3333-333-3333-333---
примерно так!
Здравствуйте, ioni, Вы писали:
I>Здравствуйте, ioni, Вы писали:
S>>>Когда тестировал функция functions_pthread просто в цикле записывает символы в строку. S>>>Процесс один! При тестировании запускал 3 потока, которые записывали в одну строку символы, затем вывел ее на экран!
I>>Итак все три потока "лепят" в локальную для потока строку некоторые символы I>>по окончании выводят это все в одну консоль I>>никаких мыслей не возникло?
I>>консоль это ресурс доступ к которому контролирует система I>>так что как мне кажется вполне нормальное поведение I>>или вы хотели чего то неожиданного?
I>если строка одна на все потоки то вы видимо контролируете I>доступ к ней каким нибудь мутексом I>а так как потоки имееют одинаковый приоритет I>то все отдается на откуп оперционной системе I>"кто первый встал того и тапки" I>так что опять ничего неожиаданного
Как протестировать программу чтоб узнать выполняются ли потоки одновременно?
Здравствуйте, serg097, Вы писали:
S>Пример: Если каждый поток печатает свой номер, главный поток выводит "-", то результат S>--------111111-11111-111-11111-11-------2222-2222-22222222222----33333-3333-333-3333-333--- S>примерно так!
Не вижу ничего необычного, такое может быть. Планирование отдается на откуп ОС, значит, что если специально не вводить объекты синхронизации, порядок не определен. Один процессор усугубляет ситуацию. Из сказанного выше не понятно — давайте сюда код и functions_pthread в том числе.
Понатыкайте в functions_pthread рандомных sleep'ов , увидите, что поток прекращает выполнение, и начинает выполняться другой.
Что бы определить, когда поток получал управление, а когда ждал в очереди, сделайте диаграмму (массив) по абсолютному времени с разрешением ~1ms в течении 10 sec (на каждый поток свой, потом их хорошо в графическом виде представить). Увидите много интересного — и кванты времени, которые отводятся потокам, и очередность выполнения...