0

私はスレッド ライブラリの構築に取り組んでいますが、何らかの理由で単純な malloc の問題が発生し、現在は修正できません。私はそれが欠けているだけの単純なものだと確信しています。

私の main.c には、次のコードがあります。

//declare testSem
tasem_t testSem;


int main(int argc, char **argv){
    ta_libinit();

    //initialize testSem
    ta_sem_init(&testSem, 5);
    //wait test
    ta_sem_wait(&testSem);

私のスレッドライブラリの関連コードは次のとおりです。

void ta_sem_init(tasem_t *sema, int value)
{

    //malloc the semaphore struct
    sema = malloc(sizeof(tasem_t));

    //error check
    if(sema == NULL)
    {
        printf("could not malloc semaphore");
        exit(0);
    }

    //initialize with the given value
    sema->val = value;
    printf("SemaVal = %i\n", sema->val);
}

void ta_sem_wait(tasem_t *sema)
{
    printf("SemaVal = %i\n", sema->val);

    if(sema->val <= 0)
    {
        //not done yet
        printf("SWAPPING\n");
    }
    else
    {
        printf("SemaVal = %i\n", sema->val);
        sema->val = sema->val + 1;
    }
}

私のヘッダーファイルの構造体は次のとおりです。

//struct to store each semas info
typedef struct tasem_t_struct
{
    //value
    int val;
        //Q* Queue
        //int numThreads


}tasem_t;

これから得られる出力は次のとおりです。

SemaVal = 5 SemaVal = 0 スワッピング

明らかに、スコープ外に出ると内部の値が失われるため、構造体を正しく malloc していません。簡単なことを忘れているに違いないことはわかっています。何か案は?

4

1 に答える 1

3

誰があなたのtasem_t構造を割り当てる責任があるかを決めることができないようです。そのためのグローバル変数があり、そのアドレスを に渡しますta_sem_init。しかし、ta_sem_init新しいtasem_t構造体を動的に割り当て、そのアドレスをローカル関数の引数である に保存してsemaいるので、そのアドレスは範囲外になると失われます。

次のいずれかを選択します。

于 2013-04-07T19:42:41.367 に答える