Не могу понять, почему так происходит.
Создается поток, который ждет мютекса, этот мютекс освобождается из
главного процесса, поток продолжает работать и меняет статусную
информацию, затем снова повисает на мютексе.
В главном процессе в бесконечном цикле ожидается определенная статусная
информация полученная из потока. Если в этом цикле поставить 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