1

基本的に、私はロックの独自の実装を作成するクラス プロジェクトに取り組んでいます。私のロック コードは正しいと確信していますが、テスト コードが正しく動作していません。私たちは、私の教授がクラスに与えた sthreads と呼ばれる pthreads のバージョンを使用しています。ここに私のテストコードがあります:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "sync.h"
#include "sthread.h"

sthread_mutex_t *mutex;
int locktest(void* arg){
    int threadNum = (int)arg;
    //int i;
    for(;;){ 
        int x  = sthread_mutex_lock(mutex);
        printf("return value: %d\n", x);
        //sleep(1);
        printf("thread %d has the lock\n", threadNum);
        sleep(1);
        sthread_mutex_unlock(mutex);
    }
    return 0;
}


int main(){
sthread_t thr1, thr2, thr3, thr4, thr5;

if (sthread_init() == -1){
    return -1;
}

if(sthread_mutex_init(mutex)){
    return -1;
}

sthread_mutex_lock(mutex);

if (sthread_create(&thr1, locktest, (void *)1) == -1){
    return -1;
}
if (sthread_create(&thr2, locktest, (void *)2) == -1){
    return -1;
}
if (sthread_create(&thr3, locktest, (void *)3) == -1){
    return -1;
}
if (sthread_create(&thr4, locktest, (void *)4) == -1){
    return -1;
}
if (sthread_create(&thr5, locktest, (void *)5) == -1){
    return -1;
}

sleep(100);
sthread_mutex_unlock(mutex);
sthread_mutex_destroy(mutex);
return 0;

}

ミューテックスはグローバルですが、各スレッドには異なるインスタンスがあります。これは、関数 locktest (各スレッドが実行する) の sthread_mutex_lock(mutex) への各呼び出しの戻り値が 0 ではないため、これを知っています。 2番目のifステートメントのメインです。

なぜこれが起こっているのか、誰も手がかりを持っていますか?

4

1 に答える 1

3

mutex何かを指すように初期化することはないため、値は ですNULLsthread_mutex_init(mutex)基本的に値が渡されたため、機能しませんNULL

おそらく必要です(を取るとsthread_mutex_init(&mutex)宣言します)。sthread_mutex_initsthread_mutex_t **

于 2012-10-17T04:16:37.923 に答える