2012-04-25 11 views
0

私は標準ライブラリ内にmutexを実装しようとしていますが、私はそれらのどこにも行きません。既存のスレッドライブラリ(uClibcなど)をコンパイルすることはこのプラットフォームでは不可能なので、必ず理解してはいけないことを実装しようとするのは悪い考えですが、私はする必要があります。 ミューテックスのために "私に5のように説明してください"ということはありますか?また、「簡単な」実装がありますか?私が今までに見たpthreadの実装はすべて、実行することが不可能です。mutexの実装ですか?

私はロック機能を実装しました。私は自分が何をしているのか分からないので、それに重大な間違いがあると確信しています。

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.もしfutexについて疑問があるなら、私はLinuxカーネルを使っています。 __sync_lock_test_and_set に

+0

これはおそらく非常にばかげた質問です。 –

+0

Linuxカーネルを使用している場合、なぜ既存のスレッドライブラリを使用できないのですか? –

+0

非常に非標準のlibc実装と標準のpthread実装を組み合わせる必要があります。そして、私はARM上で動作する良いスタンドアロンのpthread実装を見つけることができません。 –

答えて

関連する問題