Вопрос по Pthreads
От: py  
Дата: 23.11.06 21:52
Оценка:
Не могу понять, почему так происходит.
Создается поток, который ждет мютекса, этот мютекс освобождается из
главного процесса, поток продолжает работать и меняет статусную
информацию, затем снова повисает на мютексе.

В главном процессе в бесконечном цикле ожидается определенная статусная
информация полученная из потока. Если в этом цикле поставить sleep или
что-нибудь еще, скажем, printf то все завершается нормально. Если этого
нет, то процесс зацикливается.

Почему?
Вот код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>

#include <pthread.h>

/* Контекст */
class SomeStruct {
public:
    SomeStruct () {
        pthread_mutex_init(&mutex, NULL);
    }

    pthread_mutex_t  mutex;
    int state;
};

/* Крутится в потоке */
void * SomeFunc (void * param)
{
    SomeStruct * s = static_cast<SomeStruct *> (param);

    while (1) {
        printf("Mutex is locked?\n");
        pthread_mutex_lock(&s->mutex);    
        s->state = 2;
        printf("Done\n");
    }
}

int main(int argc, char ** argv)
{
    pthread_attr_t  attr;    
    pthread_t       thread;

    SomeStruct s;
    s.state = 1;

    /* Блокируем mutex и создаем поток */
    pthread_mutex_lock(&s.mutex);    

    pthread_attr_init(&attr);
    pthread_create(&thread, &attr, &SomeFunc, &s);

    /* Разблокируем мютекс и ждем пока выставится state == 2 */
    pthread_mutex_unlock(&s.mutex);        
    while (1) {
        /* Если закомментировать строку sleep(1), то процесс зависнет,
           если sleep выставлен, то все проходит нормально */
        sleep(1);

        if (s.state == 2) {
            printf("OK!\n");
            break;
        }
    }
    printf("Exit, state=%d\n", s.state);

    return 0;    
}


Компилировать, если что:
g++ -c -pipe -O2 -g -Wall -o main.o main.cpp
gcc -Wall -o ptest main.o -lstdc++ -lpthread
Posted via RSDN NNTP Server 2.0
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.