2017-02-03 4 views
1

私は変数をスレッドに渡そうとしていましたが、2番目のスレッドが作成されても定数変数として作成されていても値は変わります。C - ローカルスレッド変数が共有されています

//for the first user 
if (flag == 0) { 
    //store the socket 
    cl_sc[0] = client_sock_desc; 
    //set id 
    whichOne[0] = 0; 
    puts("Client accepted"); 
    //second user ,same procedure 
} 
else if (flag == 1) { 
    cl_sc[1] = client_sock_desc; 
    whichOne[0] = 1; 
    puts("Client accepted"); 
} 

//create thread and pass cl_sc as arguement 
pthread_t sTcThread; 
pthread_create(&sTcThread, NULL, server_to_client, (void*)whichOne); 

そしてここで、実行の

void* server_to_client(void* socket_desc) 
{ 
    //make the arguement readable 
    const int* whichOne = (int*)socket_desc; 
    //one int for retrieved data and one for his socket 
    int retrieve, socket = cl_sc[whichOne[0]]; 
    //chat buddy socket 
    int palsSocket; 

    //the actual data 
    char data[DATA_LENGTH]; 
    //free the string 
    memset(data, 0, DATA_LENGTH); 
    for (;;) { 
     //set accordingly 
     if (whichOne[0] == 0) { 
      palsSocket = cl_sc[1]; 
     } 
     else if (whichOne[0] == 1) { 
      palsSocket = cl_sc[0]; 
     } 
     printf("Im %d to join my socket is %d and my pals socket is %d\n", whichOne[0], socket, palsSocket); 
    } 
} 

結果が

クライアントが自分のソケットに参加するイム0を受け入れスレッドimplimentationは4であると私の仲間ソケットが受け入れ0
クライアントであります私のソケットに参加するためのIm 1は5、私の仲間のソケットは4

しかし、瞬間スレッド0が、これは私のソケットが4であると私の仲間のソケットが1

に一定のwhichOneを変更する4

解決され参加すること

イム1をたまたま起動していますそのような答えとコメントのおかげで。それは共有メモリ領域上の点以来whichOneはなく、別のスレッドによって、あなたのサブルーチンの命令によって変更されていないことを

int *whichOneImported = (int *) socket_desc; 
    int whichOne = whichOneImported[0]; 

答えて

3

const int *whichOne = (int *) socket_desc;保証は、(あなたは合格アドレスあなたが作成whichOne配列へあなたのスレッド、そしてあなたflag == 1

は、あなたが他のスレッドにwhichOne[0] = 1;を設定すると、後でその値を変更し、私はロジックのかわからないが、多分あなたは意味:

whichOne[flag] = flag; 

、その後

pthread_create(&sTcThread, NULL, server_to_client, (void*) (whichOne+flag)); 

を分離するデータ

それとも前のスレッドを実行するwhichOneの割り当てられたコピーを作成します。

+0

私はもう少し展示が "なぜ"に役立つかもしれないと思いますが、正解です。 – aruisdante

+0

ポインタは定数ですが、実際の値ではありません。値を一定にする方法はありますか? –

+0

あなたは 'forOne [3]'スロットを定義しましたが、使用していないと思います。 –

関連する問題