2012-04-25 8 views
0

Я пытаюсь реализовать мьютексы внутри своей стандартной библиотеки, но я ни с кем не схожу. Я знаю, что неплохо пытаться реализовать что-то, что вы не всегда понимаете, но мне нужно, поскольку компиляция существующей библиотеки потоков (например, uClibc) невозможна для этой платформы. Есть ли какие-нибудь «объяснять мне, как будто я 5», для мьютексов? Или есть ли какие-либо «простые в использовании» реализации? Все реализации pthread, которые я видел до сих пор, невозможно выполнить.Реализация мьютексов?

Мое выполнение функции блокировки приведено ниже. Я почти уверен, что с этим что-то серьезно не так, потому что я понятия не имею, что я делаю.

int pthread_mutex_lock(pthread_mutex_t *pmutex) 
{ 
    OSMutex* mutex = GetOSMutex(pmutex); 

    /* Decrement the mutex counter */ 
    OSAtomicDecrement32(&(mutex->count)); 
    if (mutex->count < -1) { 
     /* 
      Contended, wait for the mutex to be released. 
     */ 
     lnkLog("mutex %p already held (n=%d), waiting for stuff to change", mutex, mutex->count); 

     futex$LINUX(&(mutex->data), 
        FUTEX_WAIT, 
        MUTEX_MAGIC, 
        NULL, 
        NULL, 
        0); 

     lnkLog("mutex %p was released", mutex); 

     return 0; 
    } 
    else { 
     /* 
      Not contended. Acquire the mutex. 
     */ 
     lnkLog("locking %p", mutex); 

     mutex->data = MUTEX_MAGIC; 
     return 0; 
    } 
} 

P.S. Если вам интересно о futexes, я использую ядро ​​Linux.

+0

Это, наверное, очень глупый вопрос. –

+0

Если вы используете ядро ​​Linux, почему использование существующей библиотеки потоков невозможно? –

+0

Мне нужно комбинировать очень нестандартную реализацию libc со стандартной реализацией pthread. И я не могу найти никаких хороших автономных реализаций pthreads, которые будут работать на ARM. –

ответ

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