0

この時点でテスト プログラムを作成してベースをダウンさせていますが、これを実行すると、ゴミの値が構造体に送られます。

これが少し不完全な場合は申し訳ありませんが、私はこれで作業しており、何時間もネットを検索しており、私が行っていることはすべて正しいようですが、 pthread_create 関数を介してそれらを渡すときに、いくつかの重要な値にガベージが挿入されています.

助けてくれてありがとう!

このコードは私に次の出力を与えています:

メイン機能実行中!

gWorkerid の初期セット = 0

ワーカー ID = 319534848

ハウディ・ドゥーディ!

睡眠を終了する

gWorkerid はトラッシュ値 = -946297088 になりました

私は期待している:

メイン機能実行中!

gWorkerid の初期セット = 0

ワーカー ID = 0

ハウディ・ドゥーディ!

睡眠を終了する

gWorkerid はゴミ値 = 0 になりました

    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    #include <pthread.h>

    #define MAX_CONN 3
    #define MAX_LINE 1000

    typedef struct worker_t
    {
        int id;
        int connection;
        pthread_t thread;
        int used;
    }WORKER_T;

    struct sockaddr_in gServ_addr;

    WORKER_T gWorker[MAX_CONN];
    char sendBuff[1025];

    // Thread function
    void * worker_proc(void *arg)
    {
        WORKER_T *me = (WORKER_T*) arg;

        printf("Howdy Doody!\n");

        return NULL;
    }

    int main(int argc, char *argv[])
    {
        printf("main function running!\n");
        pthread_t threadTest;
        int i = 0;

        gWorker[i].id = i;
        printf("initial set of gWorkerid = %d\n", gWorker[i].id);
        gWorker[i].connection = i;
        gWorker[i].used = 1;
        pthread_create(&gWorker[i], NULL, worker_proc, &gWorker[i]);

        sleep(1);

        printf("end sleep\n");
        printf("gWorkerid is now trash value = %d\n", gWorker[i].id);

        return 0;
    }
4

2 に答える 2

0

この線:

pthread_create (&gWorker[i], NULL, worker_proc, &gWorker[i]);

実際には次のようにする必要があります。

pthread_create (&(gWorker[i].thread), NULL, worker_proc, &gWorker[i]);

への最初のパラメーターpthread_create()は、スレッド ID を格納する場所であり、コードの場合、構造体の先頭に上書きして格納しますid

構造体のスレッド ID 部分のアドレスを渡すことで、 はそのidままにしておく必要がありますpthread_create()

于 2013-02-01T03:53:04.980 に答える
0

変更してみてください:


pthread_create(&gWorker[i], NULL, worker_proc, &gWorker[i]);

に:


pthread_create(&(gWorker[i].thread), NULL, worker_proc, &gWorker[i]);

pthread_create()は、最初の引数としてa へのポインターを期待し、pthread_tそれを次に設定します。あなたの場合、あなたの構造pthread_createの上に移入しています。WORKER_T

于 2013-02-01T03:55:14.727 に答える