Нити

Модератор: Модераторы разделов

Аватара пользователя
Subj
Сообщения: 151
Статус: Useful
ОС: win

Нити

Сообщение Subj »

В виду плохого знания си есть просьба написать программку, которая должна запускать потоки( по идее бесконечное количество копий), только чтоб не все сразу а по одному с выводом его номера. Запущенные нити должны просто спать. Нужно узнать сколько нитей может инициализировать процесс пока не загнется (чтобы эскперементировать с параметрами системы с целью увеличения числа нитей для процесса). Система - Linux 2.6.х. Размер стека под нить должен быть дефолтный.
Написал программку на Аде (там это в две строчки делается), тем более gnat один фиг gcc использует и вроде как основа создания нитей там такая же как в си. Вот только на всех доступных машинах примерно одно и тоже число нитей получается запустить (1520 плюс минус с десяток). Запускал на тонком клиенте (где оперативы почти что нет) - те же 1500 с чем то. Осталось проверить на Си шной программке.
ЗЫ. В /proc/sys/kernel/threads-max просьба носом не тыкать, там все в порядке. ulimit -a на все показывает unlimited, пробовал через нее размер стека уменьшать - не помогает.

Код: Выделить всё

with ada.text_io;
use ada.text_io;

procedure Thr is

    task type pot is
        entry start(n:integer);
    end pot;


    task body pot is
    begin
    accept start(n:integer) do
        put_line(n'img);
    end start;
    while true loop
        delay 1.0;
    end loop;
    end pot;

    type s is access pot;

    len:integer:=20000; -- Количество нитей
    type mass is array(1..len) of s;
    a:mass;

begin
    for i in mass'range  loop -- меняем i от 1 до len
        a(i) := new pot; -- запускаем нить
        a(i).start(i);   -- вызываем рандеву с текущей нитью и передаем ей ее номер
    end loop;
end Thr;
Building better software with Ada
Спасибо сказали:
Аватара пользователя
Subj
Сообщения: 151
Статус: Useful
ОС: win

Re: Нити

Сообщение Subj »

ок. подсказали такой код:

Код: Выделить всё

#include <stdio.h>
#include <limits.h>
#include <pthread.h>
#include <asm/atomic.h>

static atomic_t threads_num;
static pthread_mutex_t thread_mtx = PTHREAD_MUTEX_INITIALIZER;

void* thread_func(void* arg) {
    printf("%u\n", atomic_read(&threads_num));
    pthread_mutex_unlock(&thread_mtx);
    sleep(UINT_MAX);
    return 0;
}

int main(int argc, char** argv) {
    int i = 0;
    void *arg;
    int t;
    atomic_set(&threads_num, 0);
    while (1) {
        pthread_t pth_id;
        pthread_mutex_lock(&thread_mtx);
        atomic_set(&threads_num, ++i);
        t=pthread_create(&pth_id, NULL, &thread_func, arg);
    }
    return 0;
}

gcc выдал следующее:

gcc ./thrmax.c -o thrmax
In file included from ./thrmax.c:5:
/usr/include/asm/atomic.h:40:2: warning: #warning Using kernel header in userland program. BAD!
/tmp/ccWLd8b9.o: In function `main':
thrmax.c:(.text+0x95): undefined reference to `pthread_create'
collect2: ld returned 1 exit status
Линковщик ругается на pthread_create. Пробовал по разному параметры передавать - одно и то же.
Вот как эта функция описывается в pthread.h на моей системе:
/usr/include/pthread.h:

Код: Выделить всё

/* Create a thread with given attributes ATTR (or default attributes
   if ATTR is NULL), and call function START_ROUTINE with given
   arguments ARG.  */
extern int pthread_create (pthread_t *__restrict __threadp,
                           __const pthread_attr_t *__restrict __attr,
                           void *(*__start_routine) (void *),
                           void *__restrict __arg) __THROW;

Как блин правильно то ее вызвать?
Building better software with Ada
Спасибо сказали:
Аватара пользователя
Subj
Сообщения: 151
Статус: Useful
ОС: win

Re: Нити

Сообщение Subj »

А, блин, надо линковать с ключем -lpthread
Building better software with Ada
Спасибо сказали:
Аватара пользователя
BlackStar
Сообщения: 1338
Статус: We are all Kosh
ОС: Fedora 10

Re: Нити

Сообщение BlackStar »

Попробуй так:

Код: Выделить всё

gcc thrmax.c -o thrmax -lpthread


ЗЫ. Нэ успел :)
LightLang Team
Спасибо сказали:
Аватара пользователя
Subj
Сообщения: 151
Статус: Useful
ОС: win

Re: Нити

Сообщение Subj »

Насчет Ады. Оказывается там все правильно, просто система GNAT использует свой размер стека и на системный ей наплевать. Указать размер можно с помощью директивы
pragma Storage_Size(<size in bytes>)
Поставив 10240*1024 (как в моей системе) получились те же 304 как и в Си шной программке.
Building better software with Ada
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Нити

Сообщение elide »

Subj, ну ты бы еще Erlang'овские процессы посчитал...
слава роботам!
Спасибо сказали:
Аватара пользователя
Subj
Сообщения: 151
Статус: Useful
ОС: win

Re: Нити

Сообщение Subj »

elide писал(а):
17.04.2007 14:33
Subj, ну ты бы еще Erlang'овские процессы посчитал...

Ну Erlang слишком узкоспецифичный язык.
Если что, зайди на ada-ru.org
Building better software with Ada
Спасибо сказали: