Страниц: 1 [2] 3 4 ... 8
  Печать  
Автор Тема: сколько нитей можно запустить одновременно в рамках одного процесса  (Прочитано 47844 раз)
Katya21
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #15 : Декабря 19, 2006, 01:48:31 pm »

pthread_create в fork() - это чтобы создаваемые нити принадлежали одному дочернему процессу. Я проверяла, у них всех pid один и тот же. А прога моя выводит просто номер i нити, которая создалась в этом fork()
Записан
Katya21
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #16 : Декабря 19, 2006, 01:50:09 pm »

то есть вместо того, чтобы писать какую-то прогу, мне просто надо было поискать в библиотеках QNX-а?
Записан
olej
QOR.Team
****
Offline Offline

Сообщений: 42



Просмотр профиля
« Ответ #17 : Декабря 19, 2006, 02:07:53 pm »

Katya21
то есть вместо того, чтобы писать какую-то прогу, мне просто надо было поискать в библиотеках QNX-а?


Точнее: в заголовочных файлах...
Только вы там ничего не найдёте , потому как каким-то стандартом POSIX от 06.1995г. - эта константа упразднена .
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #18 : Декабря 19, 2006, 02:25:38 pm »

he Open Group Base Specifications Issue 6
IEEE Std 1003.1, 2004 Edition
http://www.opengroup.org/onlinepubs/009695399/functions/pthread_create.html

Еще есть там PTHREAD_THREADS_MAX - только это расширение, и расширение опциональное. В sysconf можно посмотреть значение _SC_THREAD_THREADS_MAX. Есть ли в QNX - нужно смотреть.
Записан

lastcross
Full Member
***
Offline Offline

Сообщений: 237


Просмотр профиля
« Ответ #19 : Декабря 19, 2006, 02:34:59 pm »

http://www.opengroup.org/onlinepubs/009695399/functions/pthread_create.html

или

http://www.opennet.ru/man.shtml?topic=pthread_create&category=3&russian=5

Понятное дело .. это конешна не QNX .. но и POSIX, тоже никто неотменял - всетаки блин.. не чистокуниксовая функция.. А то что в limit.h кто-то написал такие строчки - дак флаг им вруки ...им значит виднее было. Спор конечно не критичный (в данном контексте), но было бы кпримеру оч. удивительно тут..(я тут дам волю фантазии) если вдруг оператор new не выделял память.. как все привыкли "ожидать" от него.. а делал что-либо другое.. и только терпеливый программист открыл бы истину для себя - прочитав что же конкретно трактует QNX (конкретнее..компилер..наверное) по этому поводу.
А может я старый стал.. и смотрю по "старым" ссылкам ?
Но суть проблемы.. не в этом.. Влюбом случае Обработка ошибок - конкретнее говорит .. что сощдать поток не получается (толи прав нехватает.. толи ресурсы не позволяют)... поэтому признаку стоит прекращать клепать потоки.. и разбираца почему.. и выводить подсчет потоков.

Katya21

то есть вместо того, чтобы писать какую-то прогу, мне просто надо было поискать в библиотеках QNX-а?
]

..я даже незнаю что ответить - видишь что пишут по этому поводу Olej?
- вобщем случае, мне так думалось, что ограничение на количество потоков - это ресурсы (толи это стек.. толи это индетификаторы..толи еще чего)
Кстати.. зачем создавать было еще один процесс? .. ведь начиная с main() - у тебя уже есть процесс ..
Записан
lastcross
Full Member
***
Offline Offline

Сообщений: 237


Просмотр профиля
« Ответ #20 : Декабря 19, 2006, 02:36:52 pm »

Спасиба.. lestat-у .. за мою спокойную.. сегоднешнюю..ночь
Записан
olej
QOR.Team
****
Offline Offline

Сообщений: 42



Просмотр профиля
« Ответ #21 : Декабря 19, 2006, 03:38:35 pm »

lastcross
Спасиба.. lestat-у .. за мою спокойную.. сегоднешнюю..ночь


... и за некоторую ясность: что и откуда пришло
Записан
Katya21
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #22 : Декабря 21, 2006, 01:49:09 pm »

#include <stdio.h>
#include<process.h>
#include<unistd.h>
#include<pthread.h>
#include<sys/wait.h>
#include<sys/neutrino.h>

int chid;
void* nit(void* foo)
 { char buf[3];
     int num_nit;
    int coid=ConnectAttach(0,0,chid,0,0);
    MsgSend(coid,"",1,buf,3);
 }

int main()
 { int p, i, tid, temp;
    chid=ChannelCreate(0);
    i=0; tid=0;
    p=fork();
    if(p==0)  
       while(tid>=0)  
         { i++;
            pthread_create(&tid,0,(void* (*)(void *))nit, 0);
            if(tid==temp) break;
            printf("
 tid = %d",tid);
            temp=tid;
          }  
      wait(0);
     printf("
 i = %d",i);
     getchar();
    return(0);
  }
Вот! Как только добирается до 65534, tid все время повторяется! Это и есть предел.
Записан
lastcross
Full Member
***
Offline Offline

Сообщений: 237


Просмотр профиля
« Ответ #23 : Декабря 21, 2006, 05:57:37 pm »

Многоуважаемая...девушка...
На вопрос типа... " ..сколько нитей можно запустить одновременно в рамках одного процесса.." ответить точно никто Вам не берется... Потому как в Вашем вопросе стоит непонятное слово "..МОЖНО..", какждый может страктовать его по разному ..(кому, когда, и сколько ...это самое "можно".. Все зависит от вашего кода . В одной реализации - можно 200 потока.. в другой 2.. В тойже риализации но на другом тазике.. под другим юзером - ниодного незя будит запустить.
Если же Вас интересует - ограничение на количество создаваемых потоков в одном процессе.. тогда прочитайте внимательно все что тут было написано до этого..
Ибо когданить..вас очень удивит тот факт .. что ваш процесс больше двух потоков не запускает.... А еще интереснее - ниодного потока не запустил (pthread_create - вернет ошибку которую.. вы так яро необрабатываете досихпор..), а может стека им не хватает... а может параметры не верны...Это кстати бы избавило Вас от всяких манипуляций с дополнительной переменной temp..

И воще..что за привычка пихать в pthread_create в качестве  первого параметра, индетификатора потока, указатель на объект переменной типа int.. когда на самом деле тип у нее должен быть pthread_t!!!. Может и на вашей машине... и сегодня ..pthread_t это эквивалент типа int..пока-что.. А Вы хотите удивица через ..годика так два... перекомпилировав свой код на другой машине..? А вощем.. флаг вруки Вам ..

Темболее, про ограничение связанные с индетификатором потоков тут уже писалось до Вас .. Читаете невнимательно ))
Записан
Evgeniy
Jr. Member
**
Offline Offline

Сообщений: 73


Просмотр профиля
« Ответ #24 : Декабря 21, 2006, 07:38:07 pm »

Вот интересно: с каких это пор все стали такими грамотными, грозными и пушистыми? Неужели в нонешней России, Украине и  пр. стало нормой советовать студентам посылать преподавателей университета и демонстрировать им их безграмотность (даже если они действительно тупые)?
Ведь с самого начала сказано:
Katya21
В универе дали задание: установить сколько нитей можно запустить в рамках одного процесса

Может кто присоветует студентке что-нибудь более конструктивное, чем объявить в универе, что все препы козлы? К сожалению, я сегодня слишком далек от вузовских нравов и уж тем более в ex-USSR...
Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #25 : Декабря 22, 2006, 04:54:41 am »

Evgeniy
Вот интересно: с каких это пор все стали такими грамотными, грозными и пушистыми? Неужели в нонешней России, Украине и пр. стало нормой советовать студентам посылать преподавателей университета и демонстрировать им их безграмотность (даже если они действительно тупые)?

Советовать вряд ли стало нормой, а посылать - пожалуй уже норма. И чем круче родители студента (больше денег), тем дальше, как правило, студенты посылают преподавателей
Evgeniy
Ведь с самого начала сказано:

Katya21
В универе дали задание: установить сколько нитей можно запустить в рамках одного процесса


В совсем другой ветке обсуждения (что не делает чести студенту, это не этично, по крайней мере, заводить дискуссию на одну тему сразу в двух местах на форуме), было универовское задание, и был вопрос, мало связанный с этим заданием. lestat дал конкретный ответ на конкретный вопрос (как уже было упомянуто, не связанный с заданием). Может тут многое модераторами поправлено, и я что-то упустил.
Evgeniy
Может кто присоветует студентке что-нибудь более конструктивное, чем объявить в универе, что все препы козлы?

Опять же, я наверно что-то упустил. Потому как выше в этой дисскуссии именно даны дельные советы. Как я понимаю, это либо лаба либо практика, и преп хочет видеть код, в котором студент создает потоки, считает их, и по упору аккуратно прибивает все потоки и сообщает цифирю. Дополнительным вопросом может быть, отчего зависит эта полученная цифра и пр. Код, который студент два раза сюда послал, заслуживает оценки 2 (два) балла по старосоветской системе (может у них уже 2 - это твердый зачет, я не в курсе). И выше было сказано почему. Повторю. Чтобы исправить положение и получить троечку, надо ответить на дополнительные вопросы:
1) что делает функция fork() и зачем она применяется в данном конкретном случае;
2) всегда ли полезно игнорировать код завершения, возвращаемых функциями, в частности ф-цией pthread_create().
Именно так учили нас. Очень надеюсь, что хоть где-то еще так учат. Причем у нас не было вариантов выбора а-ля Америка:
а) функция fork() накалывает на вилку кусок жареной свинины;
б) порождает процесс, идентичный вызвавшему её процессу;
в) удваивает колличество процессов в системе и наливает чашечку кофе тому, кто её вызвал.
Если это не лаба или практика, а обычный зачет по теории, тогда преп обычно хочет цифру из документации или аргументированный анализ, что от чего зависит (в зависимости, что было рассказано на лекциях), без всякого кода.
Записан
Katya21
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #26 : Декабря 24, 2006, 10:04:50 pm »

Да сдала я уже эту программу. Это было часть ргз. В ргз 3 задания, это - третье.
Первые 2 я сделала верно. А вот насчет этого, про нити, преподаватель сначала сказал, чтобы я заставила нити бесконечно чего-то ждать. Вот я второй раз поместила исправленную версию - когда нити ждут подтверждения на посланное сообщение. И не надо утверждать, что они не работают!
Единственное, в чем я ошиблась - это не совсем корректное сравнение, надо было не
while(tid>=0)
{ i++;
pthread_create(&tid,0,(void* (*)(void *))nit, 0); ...

А tid=pthread_create(0,0,(void* (*)(void *))nit, 0);
чтобы в случае ошибки -1 завершить работу.

И препод наш на самом деле не просто препод, он профессор и хороший человек, поэтому попрошу не высказываться насчет того, что преподаваатели ничего не смыслят, а вы тут прям всезнайки.
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #27 : Декабря 24, 2006, 10:13:27 pm »

Детка, за такое "(void* (*)(void *))" выгоняют с любой программерской конторы. У нас это называли трёхзвёздночный программист.
Записан

Katya21
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #28 : Декабря 25, 2006, 09:16:14 am »

Это не я придумала, так в лекциях написано приводить к типу void! И имеено так "(void* (*)(void *))"  !
Записан
lastcross
Full Member
***
Offline Offline

Сообщений: 237


Просмотр профиля
« Ответ #29 : Декабря 25, 2006, 10:04:03 am »

Мдя...
..чуяло мое сердце... Ну не нужно было мне отвечать.. девушке-программистке...Но всетаки была надежда..ну хоть маленькая...да была..
Эхъ..

"Это не я придумала, так в лекциях написано приводить к типу void! И имеено так "(void* (*)(void *))" ..."

..и никто и несомневался - что Ваш препод " не просто препод, он профессор"...

И вобще, у нас ..в универе..помница ..учили ..сначала думать.. а не вписывать ..куда попало то что в "лекциях написано"
Записан
Страниц: 1 [2] 3 4 ... 8
  Печать  
 
Перейти в: