Я пытаюсь реализовать мьютексы внутри своей стандартной библиотеки, но я ни с кем не схожу. Я знаю, что неплохо пытаться реализовать что-то, что вы не всегда понимаете, но мне нужно, поскольку компиляция существующей библиотеки потоков (например, 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.
Это, наверное, очень глупый вопрос. –
Если вы используете ядро Linux, почему использование существующей библиотеки потоков невозможно? –
Мне нужно комбинировать очень нестандартную реализацию libc со стандартной реализацией pthread. И я не могу найти никаких хороших автономных реализаций pthreads, которые будут работать на ARM. –