Войти
AndroidФорумОбщее

Native, проблемы с потоками

#0
16:17, 1 апр. 2013

Есть 2 потока и функция:

pthread_mutex_t mutex;

void somefunc()
{
    pthread_mutex_lock(&mutex);

    ...

    pthread_mutex_unlock(&mutex);
}

Первый поток захватывает мьютекс. Второй вызывает функцию, но т.к. мьютекс занят - будет ждать освобождения, верно? Т.е. первый продолжает работать, освобождает мьютекс, после чего в работу включается второй поток, я правильно понимаю? Проблема в том, что освобождения не происходит и приложение виснет. Думал, что где-то повторно пытался залочить мьютекс и наставил выводов в лог, но догадка не оправдалась... с чем может быть связано?


#1
16:24, 1 апр. 2013

Функция завершается до разлочки мутекса?
Оберни лочку-разлочку в объект, чтобы разлочка случилась гарантировано.

#2
17:15, 1 апр. 2013

TarasB
На данный момент у меня сделано так:

class JC_AUTOLOCK
{
public:
    JC_AUTOLOCK(JC_MUTEX& object) : mutex(object) {mutex.fLock(); LOGI("LOCK");}
    ~JC_AUTOLOCK() {mutex.fUnlock(); LOGI("UNLOCK");}

private:
    JC_MUTEX& mutex;
};

А в коде вызываю след. образом:

void somefunc()
{
    JC_AUTOLOCK locker(mutex);
}

Функция не завершается. По логу смотрел - последняя попытка лока из другого потока, на этом, собственно, и виснет.

#3
18:56, 1 апр. 2013

Убери из функции всё мясо и попробуй, может у тебя где-то в мясе зависает, бесконечный цикл там...

#4
22:24, 1 апр. 2013

В коде это выглядит след. образом:
1) главный поток
2) поток рендера

В потоке рендера рисуется игра и т.д. Главный поток отправляет события ввода в C++, там заполняется очередь, которая затем обрабатывается потоком рендера. Зависание происходит при нажатии на какую-нибудь кнопку (не всегда, а лишь тогда, когда мьютекс оказывается уже захвачен).

AndroidФорумОбщее

Тема в архиве.