Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> передать в процесс массив структур 
:(
    Опции темы
box
Дата 31.1.2015, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 27.2.2007

Репутация: нет
Всего: 0



всем привет!
пытаюсь передать в процесс массив структур :
Код

struct thread_data{
   int  thread_id;
   char *message;
   int is_async;
   struct B myB[NUM_THREADS];
};

void monitor(void *threadarg)
{
//тут надо получить в цыкле значение всех элементов массива из структуры например message или вложенной структуры myB

}

void *PrintHello_monitor(void *threadarg)
{  
cpu_set_t mask;
int status;
CPU_ZERO(&mask);
CPU_SET((NUM_THREADS - 1), &mask);
status = sched_setaffinity(0, sizeof(mask), &mask);
if (status != 0)
{
perror("sched_setaffinity");
}

monitor(threadarg);

}

int main(){
struct thread_data td[NUM_THREADS];
...

   for( i=1; i < NUM_THREADS; i++ ){
      td[i].myB[i].fs.open ("log.txt", std::fstream::in | std::fstream::out | std::fstream::app);
      cout <<"main() : creating thread, " << i << endl;
      td[i].thread_id = i;
      td[i].is_async = is_async;
      td[i].message = (char*)"This is message";
      rc = pthread_create(&threads[i], NULL, PrintHello_monitor, (void *) &td);
      sleep(1);
      
      if (rc){
         cout << "Error:unable to create thread," << rc << endl;
         exit(-1);
      }
   }


}



Это сообщение отредактировал(а) box - 31.1.2015, 23:49
PM MAIL   Вверх
feodorv
Дата 1.2.2015, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(box @  31.1.2015,  23:15 Найти цитируемый пост)
пытаюсь передать в процесс массив структур

Всё просто:
main()
Код
      rc = pthread_create(&threads[i], NULL, PrintHello_monitor, (void *) td); // & не нужен

monitor()
Код

  struct thread_data *td = (struct thread_data *) threadarg;
  int i;

  for( i = 1; i < NUM_THREADS; i++) 
  {
    cout << td[i].thread_id << " " << td[i].message << endl;
  }



Несколько замечаний:
  • индекс в C/C++ отсчитывается от 0, не от 1:
    Цитата(box @  31.1.2015,  23:15 Найти цитируемый пост)
       for( i=1; i < NUM_THREADS; i++ )
    Здесь Вы просто теряете td[0], а реальное число структур в результате не NUM_THREADS, а (NUM_THREADS-1).
  • В чём смысл массива
    Цитата(box @  31.1.2015,  23:15 Найти цитируемый пост)
       struct B myB[NUM_THREADS];
    если заполняется только один его элемент:
    Цитата(box @  31.1.2015,  23:15 Найти цитируемый пост)
          td[ i ].myB[ i ].fs.open ("log.txt", 



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
box
Дата 1.2.2015, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 27.2.2007

Репутация: нет
Всего: 0



насчет индекса согласен
в структуре B лежат мапы и переменные разные, шеред мемори 
8 потоков собирают инфу в мапы и переменные а один разруливает что куда 

Это сообщение отредактировал(а) box - 1.2.2015, 01:05
PM MAIL   Вверх
feodorv
Дата 1.2.2015, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(box @  1.2.2015,  01:03 Найти цитируемый пост)
в структуре B лежат мапы и переменные разные, шеред мемори 
8 потоков собирают инфу в мапы и переменные а один разруливает что куда 

У Вас на каждый поток отведено NUM_THREADS структур B. А на NUM_THREADS потоков таких структур будет уже (NUM_THREADS*NUM_THREADS). Так и задумано?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
box
Дата 8.2.2015, 04:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 27.2.2007

Репутация: нет
Всего: 0



не получактся, надо получить доступ на чтение и запись в структуру td из потоков PrintHello_monitor и PrintHello а когда я пишу в потоках PrintHello :
Код

struct thread_data *td = (struct thread_data *) threadarg;
td[0].test = 100;

а читаю в потоке PrintHello_monitor :
Код

struct thread_data *td = (struct thread_data *) threadarg;
cout << td[0].test << endl;

то td[0].test всегда 0.

Код

   for( i=0; i < NUM_THREADS; i++ ){
      td[i].myB[i].fs.open ("log.txt", std::fstream::in | std::fstream::out | std::fstream::app);
      td[i].thread_id = i;
      td[i].myB[i].thread_id = i;
      td[i].is_daemon = is_daemon;
      td[i].message = (char*)"This is message";
      if(i == 0){
      rc = pthread_create(&threads[i], NULL, PrintHello_monitor, (void *) td);
     }else{
      rc = pthread_create(&threads[i], NULL, PrintHello, (void *) &td[i]);     
     }
      sleep(1);
      
      if (rc){
         cout << "Error:unable to create thread," << rc << endl;
         exit(-1);
      }
   }



PM MAIL   Вверх
feodorv
Дата 8.2.2015, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(box @  8.2.2015,  04:51 Найти цитируемый пост)
не получактся

Что именно? Что Вы хотите сделать?


Цитата(box @  8.2.2015,  04:51 Найти цитируемый пост)
td[0].test всегда 0

Поток PrintHello_monitor создается первым и успевает отработать до создания других потоков. 



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
box
Дата 8.2.2015, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 27.2.2007

Репутация: нет
Всего: 0



первый то первый но он же не останавливается на этом а продолжает получать данные , значит он должен получить данные td[0].test позже когда остальные потоки подключатся, но этого не происходит, почему?
PM MAIL   Вверх
feodorv
Дата 8.2.2015, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(box @  8.2.2015,  19:38 Найти цитируемый пост)
а продолжает получать данные

По приведенному коду этого не видно.


Потом, Вы отправляете в поток PrintHello в качестве аргумента значение &td[i]. То есть внутри этих потоков
Цитата(box @  8.2.2015,  04:51 Найти цитируемый пост)
struct thread_data *td = (struct thread_data *) threadarg
указывает каждый раз на свою область памяти. Когда в этом потоке Вы делаете 
Цитата(box @  8.2.2015,  04:51 Найти цитируемый пост)
td[0].test = 100;

(что тупо эквивалентно td->test = 100;) Вы записываете значение 100 в ячейку памяти td[i].test, где td - массив структур thread_data из стартового потока.

А в поток PrintHello_monitor Вы отправляете адрес массива структур &td (который, на Ваше счастье, совпадает с самим td), и в этом потоке рапечатываете td[0].test - значение, которое никак не меняется в создаваемых потоках. Как было 0, так и остаётся.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
box
Дата 8.2.2015, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 27.2.2007

Репутация: нет
Всего: 0



ну я вообщем то так и думал, а что же делать ? надо иметь доступ к структуре из любого треда
PM MAIL   Вверх
feodorv
Дата 9.2.2015, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(box @  8.2.2015,  22:50 Найти цитируемый пост)
а что же делать

Решений масса. Начиная от глобальной переменной 
Код
struct thread_data td[NUM_THREADS];
и кончая тем, что в структуру thread_data вводится дополнительное поле - адрес всего массива структур thread_data:
Код

struct thread_data{
   int  thread_id;
   struct thread_data *list;
   char *message;
   int is_async;
   struct B myB[NUM_THREADS];
};

...

for( i=1; i < NUM_THREADS; i++ )
{
      // для каждого потока - свои данные
      td[i].myB[i].fs.open ("log.txt", std::fstream::in | std::fstream::out | std::fstream::app);
      cout <<"main() : creating thread, " << i << endl;
      td[i].list = td;
      td[i].thread_id = i;
      td[i].is_async = is_async;
      td[i].message = (char*)"This is message";



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
box
Дата 9.2.2015, 07:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 27.2.2007

Репутация: нет
Всего: 0



не понимаю каково практическое применение от ввода доп поля? приведите пожалуйста пример
PM MAIL   Вверх
feodorv
Дата 10.2.2015, 02:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(box @  9.2.2015,  07:25 Найти цитируемый пост)
не понимаю каково практическое применение от ввода доп поля?

У Вас потоки PrintHello имеют доступ только к одному элементу начального массива td, так они смогут иметь доступ ко всему массиву (состоящего из NUM_THREADS структур thread_data). В том числе и к полю td[0].test, которое печатает PrintHello_monitor.


Вообще, наш разговор походит на беседу глухого со слепым. Я не понимаю, что Вы хотите сделать. Я не понимаю, какой смысл Вы вкладываете в эту фразу:
Цитата(box @  8.2.2015,  22:50 Найти цитируемый пост)
надо иметь доступ к структуре из любого треда 

если не видите профита от введения дополнительного поля. Я так до сих пор и не понял этого:
Цитата(feodorv @  1.2.2015,  16:37 Найти цитируемый пост)
У Вас на каждый поток отведено NUM_THREADS структур B. А на NUM_THREADS потоков таких структур будет уже (NUM_THREADS*NUM_THREADS). Так и задумано?

Я не понимаю, зачем Вы массив
Цитата(box @  31.1.2015,  23:15 Найти цитируемый пост)
struct thread_data td[NUM_THREADS];

назвали именем td, таким же, как и отдельные экземпляры структуры thread_data в создаваемых потоках. Путаницы от этого немерено. 


Не экстрасенс я, никак smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
box
Дата 10.2.2015, 04:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 27.2.2007

Репутация: нет
Всего: 0



насчет того что структур B будет (NUM_THREADS*NUM_THREADS) не согласен ибо для каждого треда создается один экземпляр структуры и соответсвенно и по одному экземпляру всех вложенных структур.
мне надо всего лиш протянуть нити ввиде общей структуры от всех и каждого потока в один единственный управляющий поток, я конечно понимаю что реализовать сие без помощи мютексов будет весьма проблематично ибо данные приходят ассинхронно но хотя бы и с мютексами тоже былоб не плохо , по поводу общей структуры td - не лучший вариант ибо тогда все нити потянутся к одному не рабочему треду что был родителем всех процессов и тем самым повлечет за собой черезмерную нагрузку на один + один рабочий тред, мне же надо максимально распаралелить (в каждом треде свои контейнеры и переменные) все данные во всех тредах , так вот как провести нить из каждого треда ввиде структуры в управляющий тред ?
PM MAIL   Вверх
xvr
Дата 10.2.2015, 14:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(box @  10.2.2015,  04:08 Найти цитируемый пост)
насчет того что структур B будет (NUM_THREADS*NUM_THREADS) не согласен

Ваше согласие или несогласие к делу не пришьешь - в коде, который вы написали, структур B ровно NUM_THREADS*NUM_THREADS штук (в 31 строке NUM_THREADS структур thread_data, каждая из которых содержит NUM_THREADS структур B - см строку 5)

Цитата(box @  10.2.2015,  04:08 Найти цитируемый пост)
мне надо всего лиш протянуть нити ввиде общей структуры от всех и каждого потока в один единственный управляющий поток

Вы уверены, что вам нужна именно одна общая структура? Что в ней должно содержаться? Ибо ваше желание -
Цитата(box @  10.2.2015,  04:08 Найти цитируемый пост)
мне же надо максимально распаралелить (в каждом треде свои контейнеры и переменные) все данные во всех тредах
противоречат этой самой 'общей структуре'

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0577 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.