LINUX.ORG.RU

Стандартный вывод в pthreads...


0

0

Такая беда: в цикле создается набор pthreads. Каждому из них передается указатель на одну и ту же стартовую функцию, которая при входе печатет на стандартный вывод сообщение - одно. Однако в реальной проге каждый поток печатает не одно, а несколько одинаковых мессаг, причем неравное количество. Мессаги перемешиваются. fflush, fsync пробовал, не помогают :(( Подскажите, кто знает, в чем тут может быть дело. Заранее спасибо.

anonymous

Посмотри на flockfile, ftrylockfile

Die-Hard ★★★★★
()

Хм странно

я как-то такого не замечал. Ты может посмотри, где нить ошибку. Или код пришли. И вопрос. А ты в конце строки ставил "\n" ?

Dead ★★★★
()

> Однако в реальной проге каждый поток печатает не одно, а несколько одинаковых мессаг,
> причем неравное количество. Мессаги перемешиваются.
Может, я неправильно понял? Подробнее эту фразу, pls.

По POSIX стандартам операции над потоками thread-атомарны. Никто не вклеится
посреди выводимой строки, если она выводится одним оператором.

Может, ты какие-нибыдь хитрые нитки юзаешь?

Die-Hard ★★★★★
()

Подскажите насчет сигналов, кто знает...

Вот такой код:

#include <time.h> #include <stdio.h> #include <unistd.h> #include <errno.h> #include <pthread.h>

#define N 5

typedef int INT32; typedef unsigned long CARD32; typedef char *ADDRESS; typedef void (*PROC)(ADDRESS);

pthread_t eves[N];

void eve_start(char * p) { int id = (int)p; printf("Eve thread %d started.\n", id); fflush(stdout); sleep(3); }

int main() { int i; int p[2]; int err;

for(i = 0; i < N; ++i) { if((err = CreateThread(&eves[i], &eve_start, 1024, (char *)i, 50)) != 0) { printf("Error creating eve thread %d. Exiting.\n", i); exit(1); } }

sleep(5); ................ }

INT32 CreateThread(pthread_t *t, PROC proc, CARD32 stack, ADDRESS param, INT32 prio) { pthread_attr_t attr; int err; pthread_attr_init ( &attr ); err=pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED ); if (err) return err; pthread_attr_setstacksize ( &attr, stack );

err = pthread_create ( t, &attr, (void*(*)(void*))proc, param ); pthread_attr_destroy( &attr ); return err; }

JekLove
()

Подскажите насчет сигналов, кто знает...

#include <time.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>

#define N 5

typedef int INT32;
typedef unsigned long CARD32;
typedef char *ADDRESS;
typedef void (*PROC)(ADDRESS);

pthread_t eves[N];

void eve_start(char * p) {
        int id = (int)p;
        printf("Eve thread %d started.\n", id);
        fflush(stdout);
        sleep(3);
}

int main() {
        int i;
        int p[2];
        int err;

        for(i = 0; i < N; ++i) {
                if((err = CreateThread(&eves[i],
                                       &eve_start,
                                       1024,
                                       (char *)i,
                                       50)) != 0)
                {
                        printf("Error creating eve thread %d. Exiting.\n", i);
                        exit(1);
                }
        }

        sleep(5);
        ................
}

INT32 CreateThread(pthread_t *t,
                   PROC proc,
                   CARD32 stack,
                   ADDRESS param,
                   INT32 prio) {
        pthread_attr_t attr;
        int err;
         
        pthread_attr_init (  &attr );
        err=pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED );
        if (err) return err;
        pthread_attr_setstacksize ( &attr, stack );

        err = pthread_create ( t, &attr, (void*(*)(void*))proc, param );
        pthread_attr_destroy( &attr );
        return err;
}

JekLove
()
Ответ на: Подскажите насчет сигналов, кто знает... от JekLove

2JekLove (*) (2003-02-11 12:51:25.625):

Прогнал твой пример на SMP машине - все работает правильно, никакого смешивания,
даже безо всяких fflush(stdout);

Если сделать так:
printf("Eve ");
printf("thread %d started.\n", id);
то смешивание появляется.

Возможно, дело в отсутствии хидера:
#include <pthread.h>
Я не могу проверить, у меня без него ни компилится.

Дело в том, что libpthread основательно перелопачивает stdio.

Попробуй вставить #include <pthread.h>

Die-Hard ★★★★★
()

pthreads: ожидание нескольких семафоров

Очень странно. Ниже привожу рабочий листинг (вставил хидер и заменил точки в мейне на return 0):

-out.c------------------------------------
#include <time.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>

#define N 5

typedef int INT32;
typedef unsigned long CARD32;
typedef char *ADDRESS;
typedef void (*PROC)(ADDRESS);

pthread_t eves[N];

void eve_start(char * p) {
        int id = (int)p;
        printf("Eve thread %d started.\n", id);
        fflush(stdout);
        sleep(3);
}

int main() {
        int i;
        int p[2];
        int err;

        for(i = 0; i < N; ++i) {
                if((err = CreateThread(&eves[i],
                                       &eve_start,
                                       1024,
                                       (char *)i,
                                       50)) != 0)
                {
                        printf("Error creating eve thread %d. Exiting.\n", i);
                        exit(1);
                }
        }

        sleep(5);
        return 0;
}

INT32 CreateThread(pthread_t *t,
                   PROC proc,
                   CARD32 stack,
                   ADDRESS param,
                   INT32 prio) {
        pthread_attr_t attr;
        int err;
         
        pthread_attr_init (  &attr );
        err=pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED );
        if (err) return err;
        pthread_attr_setstacksize ( &attr, stack );

        err = pthread_create ( t, &attr, (void*(*)(void*))proc, param );
        pthread_attr_destroy( &attr );
        return err;
}
----------------------------------------

Компиляция: 
gcc out.c -o out -lpthread
----------------------------------------

Вот пример запуска:

[jek@impulse tmp]$ ./out
Eve thread 0 started.
Eve thread 0 started.
Eve thread 1 started.
Eve thread 0 started.
Eve thread 1 started.
Eve thread 2 started.
Eve thread 0 started.
Eve thread 1 started.
Eve thread 2 started.
Eve thread 3 started.
Eve thread 0 started.
Eve thread 1 started.
Eve thread 2 started.
Eve thread 3 started.
Eve thread 4 started.

------------------------------------------

Ось:

Red Hat Linux release 8.0 (Psyche)
Kernel 2.4.18-14 on an i686.

libc-2.2.93.so
libpthread-0.10.so
--------------------------------------------

???
:-/

JekLove
()
Ответ на: pthreads: ожидание нескольких семафоров от JekLove

Вывод: что-то не работает.
POSIX требует, чтобы printf был атомарным.

Поставил
#define N 25

Результат:
Eve thread 0 started.
Eve thread 1 started.
Eve thread 2 started.
Eve thread 3 started.
Eve thread 4 started.
Eve thread 5 started.
Eve thread 6 started.
Eve thread 7 started.
Eve thread 8 started.
Eve thread 9 started.
Eve thread 10 started.
Eve thread 11 started.
Eve thread 12 started.
Eve thread 13 started.
Eve thread 14 started.
Eve thread 15 started.
Eve thread 16 started.
Eve thread 17 started.
Eve thread 18 started.
Eve thread 19 started.
Eve thread 20 started.
Eve thread 21 started.
Eve thread 22 started.
Eve thread 23 started.
Eve thread 24 started.

Гонял на трех машинах:
1:
SuSE Linux 7.1 (i386)
libc 2.2
Linux 2.4.7-4GB (1 процессор)

2:SuSE Linux 7.2 (i386)
libc 2.2.2
Linux 2.4.19-z1 #1 SMP (2 проца)

3:
OSF1 V4.0 1229 alpha (6 процессоров)

Die-Hard ★★★★★
()

Гонял на Gentoo Linux (gcc 2.95) - все было в порядке...

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