Hi!

Извиняюсь за offtopic, но может кто сможет объяснить мне следующее:
есть, например, такая программа: (Собственно вопрос в комметарии в
теле программы. Ядро 2.4.8, если это важно).

#include <sys/types.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#include <signal.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>

sem_t semaphore;

void err_abort(int code, const char* text)
{
    fprintf(stderr,"%s at \"%s\":%d: %s\n",text, __FILE__, __LINE__, 
            strerror(code));
    abort ();
}
            
void errno_abort(const char* text)
{
    fprintf (stderr, "%s at \"%s\":%d: %s\n",text, __FILE__, __LINE__, 
            strerror (errno));
    abort ();
}

void *run(void *arg)
{
    int num = *((int*)(arg));

    fprintf(stderr,"Thread %i\n", num);
    if (sem_wait(&semaphore) == -1)
        errno_abort ("Wait on semaphore");
    fprintf(stderr,"Thread %d resuming\n", num);
    return NULL;
}

int main (int argc, char *argv[])
{
    int thread_count;
    pthread_t sem_waiters[5];
    int status;

    if (sem_init (&semaphore, 0, 0) == -1)
        errno_abort ("Init semaphore");

    for (thread_count = 0; thread_count < 5; thread_count++) {
        status = pthread_create (
            &sem_waiters[thread_count], NULL,run,&thread_count);
        sleep(1);
        /* Если мы имеем вышестоящую строчку закоментрированной,
        то получаем такой вывод:

              Thread 1
              Thread 2 <------ ????
              Thread 2 <------ ????
              Thread 4
              Thread 5
              Posting from main: 0
              Posting from main: 0
              Posting from main: 0
              Posting from main: 0
              Posting from main: 0
              Posting from main: 0
              Thread 1 resuming
              Thread 2 resuming
              Thread 2 resuming
              Thread 4 resuming
              Thread 5 resuming

        Если же мы ее раскомментируем, то все работает как и должно
        по идее. Т.е. вывод такой

                Thread 0
                Thread 1
                Thread 2
                Thread 3
                Thread 4
                Posting from main: 0
                Posting from main: 0
                Posting from main: 0
                Posting from main: 0
                Posting from main: 0
                Posting from main: 0
                Thread 0 resuming
                Thread 2 resuming
                Thread 1 resuming
                Thread 3 resuming
                Thread 4 resuming

        Может кто объяснит мне что происходит и как избегать таких 
        хаков со sleep().
        
        */      
        if (status != 0)
            err_abort (status, "Create thread");
    }

    sleep(1);

    while (1) {
        int sem_value;

        if (sem_getvalue(&semaphore, &sem_value) == -1)
            errno_abort ("Get semaphore value");
        if (sem_value > 0) break;
        fprintf (stderr,"Posting from main: %d\n", sem_value);
        if (sem_post (&semaphore) == -1)
            errno_abort ("Post semaphore");
    }

    for (thread_count = 0; thread_count < 5; thread_count++) {
        status = pthread_join (sem_waiters[thread_count], NULL);
        if (status != 0)
            err_abort (status, "Join thread");
    }
    return 0;
}
-- 
WBR, Konstantin V. Sorokin
:wq

Ответить