crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

7 страниц V   1 2 3 > »   
Ответить в данную темуНачать новую тему
> Как понять что программа работает в двух потоках?
RazrFalcon
  опции профиля:
сообщение 4.10.2010, 14:31
Сообщение #1


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Есть простой пример из хелпа
.срр
#include <QtCore/QCoreApplication>
#include <QString>
#include "thread.h"
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    MyThread th, th2;
    th.start();
    th2.start();
    return a.exec();
}

void MyThread::run()
{
     for( int count = 0, x=0; count < 20000000; count++, x++ )
{
         qDebug()<<x;
     }
}
.h
#ifndef THREAD_H
#define THREAD_H

#include <qthread.h>
#include <QThread>

class MyThread : public QThread
{
     Q_OBJECT

protected:
     void run();
};



#endif // THREAD_H
.pro
QT       += core thread

QT       -= gui

TARGET = temp
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app


SOURCES += main.cpp

HEADERS += \
    thread.h

а вот вывод такой:
...
406010
406011
406012
406013
406014
406015
...
а по идее должен быть типа
...
406010
406010
406011
406011
406012
406012
...
PS: как присвоить приоритет
th.start(Priority priority = HighestPriority);
Так не хочет (из хелпа)
th2.setPriority(QThread::HighestPriority);
вот так ^_^

После применения приоритетов
713245
726544
713246
726545
713247
726546
выходит один спешит? не пойму совсем
"к слову скрин загрузки"


PSS: можно ли выбрать ядро для выполнения функции?

Сообщение отредактировал RazrFalcon - 4.10.2010, 15:01
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 4.10.2010, 18:31
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(RazrFalcon @ 4.10.2010, 17:31) *
а по идее должен быть типа
...
406010
406010
406011
406011
406012
406012


это слишком идеальный вывод, если ничего специально для этого не делать :)

Цитата(RazrFalcon @ 4.10.2010, 17:31) *
713245
726544
713246
726545
713247
726546

а вот это больше похоже на правду

он не спешит, он сдвинут по фазе
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 4.10.2010, 19:02
Сообщение #3


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Цитата(Алексей1153 @ 4.10.2010, 18:31) *
это слишком идеальный вывод, если ничего специально для этого не делать :)
Ну мне 100% синхронность не нужна, так что нормально.

Цитата(Алексей1153 @ 4.10.2010, 18:31) *
он не спешит, он сдвинут по фазе
?! :blink:

Я так понимаю что они не одинаково идут из-за того что в системе еще куча остальных процессов запущенно.
Но я так и не пойму почему не 100% оба ядра, оно(суммирование в цикле) что, мало хавает просто?
Мне интересно что надо сделать чтоб полностью забить ядра, бесконечный цикл?!
И последнее, тот пример выше, он правильный?! Это настоящая многопоточность, не семафор?

Сообщение отредактировал RazrFalcon - 4.10.2010, 19:04
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 4.10.2010, 19:32
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


в среднем где-то на 75% загружен процессор у тебя получается

а притормаживает его, наверное, qDebug()<<x;
Хотя, фиг знает :)

Цитата(RazrFalcon @ 4.10.2010, 22:02) *
Это настоящая многопоточность, не семафор?

это точно многопоточность, так как у тебя больше одного потока. Их у тебя аж 3 ))
при чём тут семафор ? Семафор вроде предназначен для ограничения одновременного доступа потоков-читателей ресурса

Цитата(RazrFalcon @ 4.10.2010, 22:02) *
И последнее, тот пример выше, он правильный?!

а это зависит от поставленной задачи
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 4.10.2010, 20:06
Сообщение #5


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Цитата(Алексей1153 @ 4.10.2010, 19:32) *
а притормаживает его, наверное, qDebug()<<x;
так я загрузить по максимуму и пытаюсь ;)

Цитата(Алексей1153 @ 4.10.2010, 19:32) *
это точно многопоточность, так как у тебя больше одного потока. Их у тебя аж 3 ))
при чём тут семафор ? Семафор вроде предназначен для ограничения одновременного доступа потоков-читателей ресурса
Почему 3-и? С семафорами я что то попутал, я имел ввиду что есть такие варианты, что просто поток кидается то на одно ядро, то на другое, и выглядит как загрузка обеих ядер, а на самом деле та же однопоточность

Цитата(Алексей1153 @ 4.10.2010, 19:32) *
а это зависит от поставленной задачи
Задача пока разобраться просто с многопоточностью и все, работают 2-а потока, ну и хорошо, меня это устраивает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 4.10.2010, 20:11
Сообщение #6


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(RazrFalcon @ 4.10.2010, 23:06) *
Почему 3-и?

ну как же - один основной и два дочерних.

Цитата(RazrFalcon @ 4.10.2010, 23:06) *
я имел ввиду что есть такие варианты, что просто поток кидается то на одно ядро, то на другое, и выглядит как загрузка обеих ядер, а на самом деле та же однопоточность

хм, вроде бы нельзя так сделать, чтоб один поток выполнялся на двух ядрах. Хотя, может быть, я чего-то не знаю ))

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 4.10.2010, 20:14
Сообщение #7


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Цитата(Алексей1153 @ 4.10.2010, 20:11) *
ну как же - один основной и два дочерних.
Непонятно?! То есть сама прога, и еще 2-а моих?! То есть можно один цикл в main'е запустить а второй в потоке втором ?!

Цитата(Алексей1153 @ 4.10.2010, 20:11) *
хм, вроде бы нельзя так сделать, чтоб один поток выполнялся на двух ядрах. Хотя, может быть, я чего-то не знаю ))
Я имел ввиду не одновременно, а поочередно, где то, когда то находил что то такое. Чуть-чуть на одном ядре, потом на втором, и снова на первом. Короче может это меня глючит.

Сообщение отредактировал RazrFalcon - 4.10.2010, 20:14
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 4.10.2010, 20:43
Сообщение #8


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(RazrFalcon @ 4.10.2010, 23:14) *
Непонятно?! То есть сама прога, и еще 2-а моих?! То есть можно один цикл в main'е запустить а второй в потоке втором ?!

процесс всегда состоит хотя бы из одного потока. Если явно не запускать дочерние потоки и не использовать компоненты/классы, которые это делают, то приложение будет работать в одном потоке
Да, можешь сделать один цикл в main (основной поток), другой в дочернем потоке. Будет два цикла в разных потоках. Только учитывай, что основной поток, попав в бесконечный цикл, перестанет реагировать на события клавиатуры и мыши, а также на на события от ОС ))

Сообщение отредактировал Алексей1153 - 4.10.2010, 20:44
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 4.10.2010, 21:05
Сообщение #9


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Ну в общем понятно. Ну я так понимаю желательно конечно 2-а потока создавать. Все равно в этот момент "главный" поток в простое.
Как вообще привязать потоки к ядрам. Чтоб они не перескакивали. То есть, это делать на первом ядре, а это на втором и не как по другому.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ufna
  опции профиля:
сообщение 5.10.2010, 9:19
Сообщение #10


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

Спасибо сказали: 29 раз(а)




Репутация:   5  


думаю средствами Qt этого не сделать, нужно копать в сторону системных API и т.п.

Т.к. это пока извечная проблема, что большинство программ на работу с несколькими ядрами не рассчитаны, система сама решает что куда положить.

Кстати, qDebug() в большей степени будет нагружать не оба потока, т.к. вывод идет в одну консоль - ее он грузить и будет. К примеру, если qDebug() отображать будет некуда, программа будет работать куда быстрее. Потому если хочешь создать нагрузку, лучше сделать что-нибудь другое.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

7 страниц V   1 2 3 > » 
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


5 чел. читают эту тему (гостей: 5, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.12.2024, 3:56