2016-10-16 21 views
0

私は関数を介してtypedefを送信しようとしています。しかし、私はできないようです。typedefがpthreadで動作しないのはなぜですか?

#define MAX 2 
typedef struct 
{ 
    unsigned long myPid; 
    unsigned long parentPid; 
    unsigned long myTid; 
} myProperties; 

void* funcproperties(void* arg); 
void createthread(myProperties (*properties)[MAX]); 

これは私のtypedefの定義方法です。

void* funcproperties(void* arg) 
{ 
    myProperties *properties=(myProperties*) arg; 
    properties->myPid=getpid(); 
    properties->parentPid=getppid();  
    properties->myTid=syscall(SYS_gettid); 
    return NULL; 
} 

私はproperties[0].myPid=getpid()に値を与えた場合、私は問題を持っていません。しかし、typedefが開始する位置(0または1)のアドレスを送信すると、それは実行されません。なぜだろう?多分pthreadはそれをサポートしませんか?

void createthread(myProperties (*properties)[MAX]) 
{ 
    pthread_t tids[MAX]; 

    for (int i = 0; i < MAX; i++) { 
     if ((errno = pthread_create(&tids[i], NULL, funcproperties, properties[i])) != 0) 
      ERROR(C_ERRO_PTHREAD_CREATE, "pthread_create() failed!"); 
    } 
    for (int i = 0; i < MAX; i++) 
     printf("\n PID:%lu DAD: %lu TID: %lu", properties[i]->myPid, properties[i]->parentPid ,properties[i]->myTid); 
} 

このは(私が定義するのpidを強制する。しかし、私は間違っていないならば、私はランダムな値を取得しています)私は取得していた結果です。

 PID:0 DAD: 3076323888 TID: 134519979 
    PID:612976384 DAD: 3077911516 TID: 3220212208 
    PID:0 DAD: 3076323888 TID: 134519979 
    PID:612976384 DAD: 3077911516 TID: 3220212208 
    PID:0 DAD: 3076323888 TID: 134519979 
    PID:612976384 DAD: 3077911516 TID: 3220212208 
    I 9292 did my job now make yourself served 

PS:私もプロセスを使用しています。

+0

「typedef」という用語の使用は、間違っていないと誤解を招くことがあります。私は関数に構造体を渡そうとしていると思いますが、構造体にタグがなく、型名が 'typedef'で指定されています。あなたが渡すものは 'typedef'ではなく、構造体または構造体へのポインタです。 –

+0

私は、 'createthread()'関数に渡された配列へのポインタについて深く疑っています。あなたの呼び出し関数が 'myProperties mp [MAX];'を持ち、それを初期化して '&mp'を' createthread() 'に渡すと、' createthread() 'の' properties [1] 'はアレイ、これはトラブルの一部である可能性があります。 –

答えて

0

は、別のスレッドがオブジェクトを変更している間に、あるスレッドがオブジェクトにアクセスできないようにする必要があります。あなたはこれをしていないので、結果は予測できません。

解決策の1つは、設定している値を調べる前にすべてのスレッドでpthread_joinを呼び出すことです。

+0

私はなぜ両方のスレッドがプログラムの異なる部分を変更しているのだろうと思いますか? –

+0

typdef [0] –

+0

を変更しています。もう1つはchypingです。typdef [1] –

関連する問題