Потоки С++ Linux [2]
От: serg097  
Дата: 26.12.07 07:25
Оценка:
Здравствуйте! В продолжении темы "Потоки С++ Linux".
В ходе тестирования программы установил, что даже если потоки не работают с устройством ввода/вывода,
они все равно выполняются по очереди. Т.е. когда запускается первый поток он начинает выполняться вместе с основным потоком, а 2-ой и все последующий ждут выполнения предыдущего. Почему? Как решить проблему?
Re: Потоки С++ Linux [2]
От: ioni Россия  
Дата: 26.12.07 07:57
Оценка:
Здравствуйте, serg097, Вы писали:

S>Здравствуйте! В продолжении темы "Потоки С++ Linux".

S>В ходе тестирования программы установил, что даже если потоки не работают с устройством ввода/вывода,
S>они все равно выполняются по очереди. Т.е. когда запускается первый поток он начинает выполняться вместе с основным потоком, а 2-ой и все последующий ждут выполнения предыдущего. Почему? Как решить проблему?


Видимо код в студию
Re[2]: Потоки С++ Linux [2]
От: serg097  
Дата: 26.12.07 08:11
Оценка:
Здравствуйте, ioni, Вы писали:

I>Здравствуйте, serg097, Вы писали:


S>>Здравствуйте! В продолжении темы "Потоки С++ Linux".

S>>В ходе тестирования программы установил, что даже если потоки не работают с устройством ввода/вывода,
S>>они все равно выполняются по очереди. Т.е. когда запускается первый поток он начинает выполняться вместе с основным потоком, а 2-ой и все последующий ждут выполнения предыдущего. Почему? Как решить проблему?


I>Видимо код в студию


pthread_t thread_id[maxcfr];
…………………….
for(int j = 0; j < quantity_flash; ++j){                     
if(tfr != -1){
…………………….
pthread_create(&thread_id[j], NULL, &functions_pthread, &params);
}
else
flg[j] = false;                              
}

for(int t = 0; t < quantity_flash; ++t)
if(flg[t])                                   
pthread_join(thread_id[t],(void**) &er_w);
…………………….

Добавлено форматирование — Кодт
Re[3]: Потоки С++ Linux [2]
От: ioni Россия  
Дата: 26.12.07 08:18
Оценка:
Здравствуйте, serg097, Вы писали:

S>Здравствуйте, ioni, Вы писали:


I>>Здравствуйте, serg097, Вы писали:


S>>>Здравствуйте! В продолжении темы "Потоки С++ Linux".

S>>>В ходе тестирования программы установил, что даже если потоки не работают с устройством ввода/вывода,
S>>>они все равно выполняются по очереди. Т.е. когда запускается первый поток он начинает выполняться вместе с основным потоком, а 2-ой и все последующий ждут выполнения предыдущего. Почему? Как решить проблему?


I>>Видимо код в студию

во первых пользуемся форматированием

pthread_t thread_id[maxcfr];

for(int j = 0; j < quantity_flash; ++j)
{                     
  if(tfr != -1)
  {
    pthread_create(&thread_id[j], NULL, &functions_pthread, &params);
  }
  else
   flg[j] = false;                              
}

for(int t = 0; t < quantity_flash; ++t)
{
  if(flg[t])                                   
   pthread_join(thread_id[t],(void**) &er_w);
}


во вторых что примерно делает functions_pthread

а в третьих у вас сколько процессоров в системе
и как вы определили то поведение какое описываете в своем вопросе
Re[4]: Потоки С++ Linux [2]
От: serg097  
Дата: 26.12.07 08:27
Оценка:
Здравствуйте, ioni, Вы писали:

I>>>Видимо код в студию

I>во первых пользуемся форматированием

I>
I>pthread_t thread_id[maxcfr];

I>for(int j = 0; j < quantity_flash; ++j)
I>{                     
I>  if(tfr != -1)
I>  {
I>    pthread_create(&thread_id[j], NULL, &functions_pthread, &params);
I>  }
I>  else
I>   flg[j] = false;                              
I>}

I>for(int t = 0; t < quantity_flash; ++t)
I>{
I>  if(flg[t])                                   
I>   pthread_join(thread_id[t],(void**) &er_w);
I>}

I>


I>во вторых что примерно делает functions_pthread


I>а в третьих у вас сколько процессоров в системе

I>и как вы определили то поведение какое описываете в своем вопросе

Когда тестировал функция functions_pthread просто в цикле записывает символы в строку.
Процесс один! При тестировании запускал 3 потока, которые записывали в одну строку символы, затем вывел ее на экран!
Re[5]: Потоки С++ Linux [2]
От: ioni Россия  
Дата: 26.12.07 08:38
Оценка:
S>Когда тестировал функция functions_pthread просто в цикле записывает символы в строку.
S>Процесс один! При тестировании запускал 3 потока, которые записывали в одну строку символы, затем вывел ее на экран!

Итак все три потока "лепят" в локальную для потока строку некоторые символы
по окончании выводят это все в одну консоль
никаких мыслей не возникло?

консоль это ресурс доступ к которому контролирует система
так что как мне кажется вполне нормальное поведение
или вы хотели чего то неожиданного?
Re[6]: Потоки С++ Linux [2]
От: ioni Россия  
Дата: 26.12.07 08:47
Оценка:
Здравствуйте, ioni, Вы писали:

S>>Когда тестировал функция functions_pthread просто в цикле записывает символы в строку.

S>>Процесс один! При тестировании запускал 3 потока, которые записывали в одну строку символы, затем вывел ее на экран!

I>Итак все три потока "лепят" в локальную для потока строку некоторые символы

I>по окончании выводят это все в одну консоль
I>никаких мыслей не возникло?

I>консоль это ресурс доступ к которому контролирует система

I>так что как мне кажется вполне нормальное поведение
I>или вы хотели чего то неожиданного?

если строка одна на все потоки то вы видимо контролируете
доступ к ней каким нибудь мутексом
а так как потоки имееют одинаковый приоритет
то все отдается на откуп оперционной системе
"кто первый встал того и тапки"
так что опять ничего неожиаданного
Re[6]: Потоки С++ Linux [2]
От: serg097  
Дата: 26.12.07 08:58
Оценка:
Здравствуйте, 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---
примерно так!
Re[7]: Потоки С++ Linux [2]
От: serg097  
Дата: 26.12.07 09:01
Оценка:
Здравствуйте, ioni, Вы писали:

I>Здравствуйте, ioni, Вы писали:


S>>>Когда тестировал функция functions_pthread просто в цикле записывает символы в строку.

S>>>Процесс один! При тестировании запускал 3 потока, которые записывали в одну строку символы, затем вывел ее на экран!

I>>Итак все три потока "лепят" в локальную для потока строку некоторые символы

I>>по окончании выводят это все в одну консоль
I>>никаких мыслей не возникло?

I>>консоль это ресурс доступ к которому контролирует система

I>>так что как мне кажется вполне нормальное поведение
I>>или вы хотели чего то неожиданного?

I>если строка одна на все потоки то вы видимо контролируете

I>доступ к ней каким нибудь мутексом
I>а так как потоки имееют одинаковый приоритет
I>то все отдается на откуп оперционной системе
I>"кто первый встал того и тапки"
I>так что опять ничего неожиаданного

Как протестировать программу чтоб узнать выполняются ли потоки одновременно?
Re[8]: Потоки С++ Linux [2]
От: ioni Россия  
Дата: 26.12.07 09:06
Оценка:
S>Как протестировать программу чтоб узнать выполняются ли потоки одновременно?

на однопроцессорной машине потоки не могут выполняться одновременно
и это принципиально замечание

запустите все как и раньше уберите объекты синхронизации
и выводите все в консоль

и то я не уверен что вывод будет ожидаемым
Re[7]: Потоки С++ Linux [2]
От: oziro Нигерия  
Дата: 26.12.07 10:22
Оценка:
Здравствуйте, 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 (на каждый поток свой, потом их хорошо в графическом виде представить). Увидите много интересного — и кванты времени, которые отводятся потокам, и очередность выполнения...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.