LINUX.ORG.RU

Семафоры в Red Hat 9.0


0

0

Ядро 2.6 Одним из больших внутренних изменений стала полностью переписанная инфраструктура нитей, позволившая использовать поверх себя Native POSIX Thread Library (NTPL). Это дало серьезное увеличение производительности на процессорах Pentium Pro и лучше в сильно "распараллеленных" приложениях, многие крупные игроки уровня предприятия требовали этого (фактически, Red Hat портировала эту возможность в ядро 2.4., входящее в состав Red Hat Linux начиная с версии 9.0). Это изменение привнесло новые концепции в Linux, включая группы нитей, локальная память отдельных нитей, сигналы в стиле POSIX и многое другое. Одним из главных недостатков является то, что приложения (такие как Sun Java) написанные без учета данной спецификации и опирающиеся на старый Linux-isms, не будут поддерживаться.

Кто-нибудь слышал о таком? Возможно ли изменить программу,ипользующую нити и семафоры, чтобы она работала в Red Hat 9.0? Если да, то как.

Схема работы такова - создается 6 нитей (pthread_create(&thread_id_i,NULL,&f_i,NULL)) и в каждой стоит sem_wait(&sem_i) i=1..6, запускается таймер и в зависимости от условий разблокирует требуемый семафор, а следовательно и соответствующую нить и так далее. В Red Hat 9.0 она после sem_post(&sem_i) вываливается в основной процесс, т.е нить не получает управления.

anonymous

Исходники программы есть? И можно ли сделать небольшой пример, все-таки на примере легче понять, что нужно. А так, можно сделать, конечно. В программе то ничего сложного нет.

anonymous
()
Ответ на: комментарий от anonymous

sem_t sem_a;

sem_t sem_b;

pthread_t thread_id1;

void *tn_tp(Void)

{ sem_wait(&sem_b); ..... };

t_06::t_06() {

sem_init(&sem_a,0,0);

sem_init(&sem_b,0,0);

pthread_create(&thread_id1,NULL,&tn_tp,NULL); };

int main () {

запуск таймера на процедуру где последний оператор - sem_post(&sem_b);

sem_wait(&sem_a);

return -1;

};

Причем sem_a больше не где не задествовано. Должен висеть мёртво. А он проваливается на return;

В RH7.2 всё работает. В RH9.0 нет. (пробовал static sem_t sem_a; - не помогает).

Мануал советует использовать мутексы.

anonymous
()
Ответ на: комментарий от chucha

export LD_ASSUME_KERNEL=2.4.2

Вылечило! Спасибо.

anonymous
()
Ответ на: комментарий от anonymous

Не знаю, как и что, но вот такая-то программа работает и с ntpl.

#include <pthread.h> #include <semaphore.h> #include <stdio.h>

static sem_t sem_a;

static sem_t sem_b;

static pthread_t thread_id1;

void *thread_1(void *data)

{ printf ("Wait for sem_b\n"); fflush (stdout);

sem_wait(&sem_b);

printf ("Thread exit\n"); fflush (stdout); }

int main () {

sem_init(&sem_a,0,0);

sem_init(&sem_b,0,0);

pthread_create(&thread_id1,NULL,thread_1,NULL);

sleep (10);

sem_post (&sem_b);

printf ("Wait for sem_a\n"); fflush (stdout);

sem_wait(&sem_a);

return 0;

}

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.