2016-02-11 3 views
1

Я heving странного бага в моем проекте, когда я нарезанный, чтобы проверить это сам, и просто посмотреть:Можно ли заблокировать два бита SDL дважды?

#include <stdio.h> 
#include <stdlib.h> 
#include <NLF.h> 
#include <SDL_mutex.h> 

SDL_mutex *mutex; 
void tt() 
{ 
    printf("func\n"); 
    printf("tentando locar: %d\n", SDL_LockMutex(mutex)); 
    printf("locado\n"); 
} 

int main(int arg, char *argc[]) 
{ 
    SDL_Thread *thread; 
    mutex = SDL_CreateMutex(); 

    printf("locado : %d\n", SDL_LockMutex(mutex)); 

    thread = SDL_CreateThread(tt, "TestThread", NULL); 

    printf("relocado : %d\n", SDL_LockMutex(mutex)); 
} 

и вот результат:

locado : 0 
func 
relocado : 0 

, то есть, то " mutex "сначала заперта правильно, затем поток попадает в функцию потока, а« мьютекс »- на вашу вещь, и поток блокируется. Но обратите внимание, что я не разблокирую «мьютекс». то я пытаюсь запереть в основной поток, и это работает ... почему? Я должен зайти в тупик. ...

странно

ответ

2

В documentation состояния:

СВД Мьютексы рекурсивным.

Это значит, вы можете заблокировать его несколько раз в том же потоке (и вам нужно, чтобы разблокировать его одинаковое количество раз, что вы запертых его в этой теме, чтобы разблокировать его для другого потока)

+0

Maan , что мое отсутствие. Спасибо –

+0

И типичные нерекурсивные мьютексы не определяют поведение, если вы пытаетесь заблокировать их мьютекс рекурсивно. Они могут зайти в тупик. Вторая операция блокировки может быть no-op. Они могут потерпеть крах. –

Смежные вопросы